在Visual Studio中编码时,我得到了一个未解决的外部符号错误 我不知道该怎么办我不知道怎么了。 你能帮我破译一下吗?我应该在哪里寻找什么样的错误?

1>Form.obj : error LNK2019: unresolved external symbol "public: class Field * __thiscall Field::addField(class Field *)" (?addField@Field@@QAEPAV1@PAV1@@Z) referenced in function "public: void __thiscall Form::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?parse@Form@@QAEXAAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Form.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Field::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?parse@Field@@UAEXAAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "public: __thiscall InputField::InputField(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (??0InputField@@QAE@AAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::prompt(void)" (?prompt@Field@@UAEXXZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Field::getName(void)" (?getName@Field@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Field::getType(void)" (?getType@Field@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::describe(void)" (?describe@Field@@UAEXXZ)
1>C:\Users\tomy\Documents\Visual Studio 2010\Projects\zapoctovkac++\Debug\zapoctovkac++.exe : fatal error LNK1120: 6 unresolved externals

当前回答

确保你用

#ifndef YOUR_HEADER_H
#define YOUR_HEADER_H

// your header code here

#endif

如果你不这样做,就会发生不好的事情,包括这件事

其他回答

此错误可能是由于将模板类的函数定义放在单独的.cpp文件中引起的。对于模板类,成员函数必须在头文件中声明。可以通过在.h文件中定义成员函数内联或紧跟类定义之后来解决这个问题。

例如,不像其他类那样将函数定义放在.cpp文件中,你可以像这样内联定义它们:

template<typename T>
MyClassName {
  void someFunction() {
    // Do something
    ...
  }
  void anotherFunction() {
    // Do something else
    ...
  }
}

或者你可以在类定义之后定义它们,但在同一个文件中,像这样:

template<typename T>
MyClassName {
  void someFunction();
  void anotherFunction();
}

void MyClassName::someFunction() {
  // Do something
  ...
}
void MyClassName::anotherFunction() {
  // Do something else
  ...
}

我只是想分享一下,因为似乎没有人提到模板类。这就是我的案例中出现错误的原因。

我的问题是一个sconscript没有定义在它的cpp文件。这可能非常令人困惑,因为Visual Studio在项目中有cpp文件,但正在构建的完全是其他东西。

I believe most of the points regarding the causes and remedies have been covered by all contributors in this thread. I just want to point out for my 'unresolved external' problem, it was caused by a datatype defined as macro that gets substituted differently than expected, which results in that incorrect type being supplied to the function in question, and since the function with type is never defined, it couldn't have been resolved. In particular, under C/C++ -> Language, there is an attribute called 'Treat WChar_t As Built in Type, which should have been defined as 'No (/Zc:wchar_t-)' but did not in my case.

检查是否包含了您所引用的解决方案中的所有源文件。

如果你没有在项目中包含Field类的源文件(以及实现),它将不会被构建,你将无法在编译期间进行链接。

或者,也许您正在使用静态或动态库,并且忘记告诉链接器有关.lib的信息?

在我的情况下,我有多个名称空间在我的头文件中没有嵌套(一个接一个),但在我的源文件中,我不小心嵌套了一个名称空间在另一个:

// myExample.h

#ifndef MYEXAMPLE_H
#define MYEXAMPLE_H

namespace A
{
  void aFunc();
}

namespace B
{
  void bFunc();
}
// myExample.cpp

#include "myExample.h"

namespace A
{
  void aFunc()
  {
    ...
  }

  namespace B   // whoops! I nested this inside namespace A when I didn't mean to.
  {
    void bFunc()
    {
      ...
    }
  }
}
// main.cpp

#include "myExample.h"

int main()
{
  myExample::B::bFunc();
  
  return 0;
}

当我在Main中使用F12对函数“Go to definition”时,Visual Studio在源文件中找到了代码,尽管它是在一个更深层的命名空间中声明的。

调试技术

我在尝试调试问题时重命名函数时发现了这个问题。重命名预览窗口显示了一个“External References”节点,其中源文件中的函数意外地嵌套在另一个名称空间下。