1

以下是我编译代码时的错误。很抱歉我不能在这里分享我的代码。仅供参考,我不使用任何外部库,所以我真的不确定这些链接器错误。它们似乎来自我在DeviceManager课堂上声明的虚函数。它们各自的实现在另外两个类中。

有人可以帮我解决这些错误吗?

1>device_manager.obj : error LNK2028: unresolved token (0A000397) "public: virtual void __clrcall DeviceManager::loadConfig(class System::IO::StreamReader ^)" (?DeviceManager@DeviceManager@@$$FUAMXP$AAVStreamReader@IO@System@@@Z) referenced in function "void __clrcall `dynamic initializer for 'const DeviceManager::`vftable'''(void)" (???__E??_7DeviceManager@@6B@@@YMXXZ@?A0xc2524ebc@@$$FYMXXZ)
1>device_manager.obj : error LNK2019: unresolved external symbol "public: virtual void __clrcall DeviceManager::loadConfig(class System::IO::StreamReader ^)" (?loadConfig@DeviceManager@@$$FUAMXP$AAVStreamReader@IO@System@@@Z) referenced in function "void __clrcall `dynamic initializer for 'const DeviceManager::`vftable'''(void)" (???__E??_7DeviceManager@@6B@@@YMXXZ@?A0xc2524ebc@@$$FYMXXZ)
1>device_manager.obj : error LNK2001: unresolved external symbol "public: virtual class Device * __thiscall DeviceManager::createDevice(void)" (?createDevice@DeviceManager@@UAEPAVDevice@@XZ)
1>device_manager.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall DeviceManager::initializeDevices(void)" (?initializeDevices@DeviceManager@@UAEXXZ)
1>C:\Users\CH\Documents\Visual Studio 2010\Projects\Test Devices\Test Devices\Debug\Test Devices.exe : fatal error LNK1120: 4 unresolved externals
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:01.50
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

更新 1(可能的解决方案):

问题似乎是因为在DeviceManager类中声明的虚函数不是纯虚函数并且在.cpp类中没有定义DeviceManager

如果DeviceManager该类没有任何非虚函数,则将虚函数设为纯函数将是解决方案。像这样virtual void testFunction();的东西并不纯粹,因此将其更改virtual void testFunction()=0;为解决方案。为此,在继承DeviceManager该类的其他类中实现此虚函数的定义就足够了。在这种情况下,DeviceManager类变得抽象,因此无法实例化。

但就我而言,DeviceManager该类也有一些非虚拟函数,并且还需要实例化才能调用非虚拟函数。因此,解决方案是在继承该类的其他类中的声明和定义之外,实现该类.cpp中虚函数的定义。DeviceManagerDeviceManager

4

1 回答 1

0

您是否尝试过完全清洁和重建?

你的类是否至少有一个非虚成员函数?
几年前我就看到过这个问题。

除此之外,我建议将函数原型和完整参数列表复制到 word pad 或其他东西中并更改字体(以防止它看起来如此熟悉以至于你的眼睛会扫描它)然后比较每个函数的调用以确保它们匹配(更可能导致编译问题,但值得检查)。

于 2012-05-14T15:01:21.507 回答