在标头中的类中添加不完整的类型时无法解析的外部

Unresolved external when just adding an incomplete type in class in header

提问人:Zebrafish 提问时间:9/27/2020 最后编辑:Zebrafish 更新时间:9/27/2020 访问量:355

问:

我不明白为什么当我向类添加内容时,链接器说它找不到这个函数。

// In .h file
class Importer
{public:
     void importOBJFile();
}

// In .cpp file
// INCLUDE ALL THE ASSIMP LIBRARY HEADERS HERE
void Importer::importOBJFile()
{
      Assimp::Importer importerInst;
      const aiScene* scene = importerInst.ReadFile("filename", aiProcess_Triangulate);
}

一切都像这样工作正常。但是,如果我添加:

const class aiScene* scene = nullptr;

...到我的类定义,或者转发声明类aiScene;然后添加:

const aiScene* scene = nullptr;

...到我的类定义,然后我得到一个编译错误:

错误LNK2019未解析的外部符号“public: class aiScene const

  • __cdecl Assimp::Importer::ReadFile(char const *,unsigned int)“ (?ReadFile@Importer@Assimp@@QEAAPEBVaiScene@@PEBDI@Z) 引用于 函数 “public: class aiScene const * __cdecl Assimp::Importer::ReadFile(类 std::basic_string<char,struct std::char_traits,class std::allocator > const &,unsigned int)” (?ReadFile@Importer@Assimp@@QEAAPEBVaiScene@@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@I@Z)

为什么当我转发声明 aiScene 类并向类定义添加指针声明时,它抱怨找不到 readFile 函数?

在我的 Importer 类之前将所有 Assimp 库标头粘贴到 .h 文件中可以解决此问题,但我想避免在标头中粘贴标头,我不明白为什么会发生这种情况。

我在 Visual Studio 2019 上

C++ Visual-Studio 链接器错误未 解决外部

评论

0赞 πάντα ῥεῖ 9/27/2020
从何而来?它在哪里实施?顺便说一句,您在示例中提到的不是转发声明。aiScene
0赞 Zebrafish 9/27/2020
@πάνταῥεῖ 它位于标头中,是 Assimp 导入器库的一部分
0赞 πάντα ῥεῖ 9/27/2020
你链接了那个图书馆吗?
0赞 Zebrafish 9/27/2020
@πάνταῥεῖ 是的,否则在将该额外成员添加到我的班级之前,它不会起作用。在我添加额外的指针之前,它工作正常。
1赞 Swift - Friday Pie 9/27/2020
@Zebrafish这是标准的。它需要匹配,否则会导致 ODR 违规。

答:

0赞 Zebrafish 9/27/2020 #1

我发现了问题所在。问题在于,由于某种原因,Visual Studio 不允许将类转发为结构,反之亦然。不知道为什么会这样。我之前问过一个问题,其他编译器并不认为类和结构为此目的不同。