我从链接器收到此错误:
1>PACBalancesTest.obj : error LNK2001: unresolved external symbol "public: bool __thiscall PAC::BalChgKeyComparator::operator()(class PAC::BalChgKey const &,class PAC::BalChgKey const &)const " (??RBalChgKeyComparator@PAC@@QBE_NABVBalChgKey@1@0@Z)
我一定遗漏了一些非常明显的东西,因为我反复查看了“遗漏”符号的定义,看不出任何问题。
符号的定义在 .lib 文件中。我在该 .lib 文件的 dumpbin /symbols 的输出中看到以下内容:
2F0 00000000 SECTFD notype () External | ??RBalChgKeyComparator@PAC@@QBE_NABVBalChgKey@1@0@Z (public: bool __thiscall PAC::BalChgKeyComparator::operator()(class PAC::BalChgKey const &,class PAC::BalChgKey const &)const )
并且从该 .lib 文件中成功解析了其他符号!(实际上,来自同一个 .obj。) [更新:我不再认为前面的说法是正确的。这可能是我第一次尝试访问任何未在 .h 文件中定义的函数。]
以下内容与问题无关——所以请不要花时间研究它!
这是函数的声明(在 PACBalances.h 中):
namespace PAC {
class BalChgKey {
public:
...
};
struct BalChgKeyComparator {
bool operator()(const BalChgKey& lhs, const BalChgKey& rhs) const;
};
typedef std::multimap<BalChgKey, long, BalChgKeyComparator> BalChgKeyLongMMap;
};
请注意,我尝试将上面的“struct”更改为“class”,但没有任何效果。
这是调用代码(在 cputest 测试文件中):
#include "CppUTest/TestHarness.h"
#include <utility>
#include <map>
#include "PACBalances.h"
using namespace PAC;
...
TEST_GROUP(PACBalanceCUMap)
{
BalChgKeyLongMMap empty;
BalChgKeyLongMMap onesy;
void setup()
{
// **Adding the following line caused this error to start to occur.**
onesy.insert(std::pair<BalChgKey, long>(BalChgKey(BOPCAT_FEE, PAYMTYPE_OVERDRAFT_FEE, 4321, 41100, 1, 17), 17));
}
void breakdown()
{
}
};
这是操作符函数本身的定义:
bool PAC::BalChgKeyComparator::operator()(
const BalChgKey& thing1,
const BalChgKey& thing2
) const
{
if (thing1.m_balKey.m_balCat < thing2.m_balKey.m_balCat) return true;
else if (thing1.m_balKey.m_balCat > thing2.m_balKey.m_balCat) return false;
// Fall thru if balCats are equal
...
return false;
}
请注意:
- 比较器和 typedef 的 multimap 在很多代码中都可以很好地工作(上面没有显示)。
- 测试文件调用了该 .h 文件中声明和定义的许多其他函数,但这是我第一次尝试调用在单独的 .cpp 文件中定义的函数。
- 我的问题不是为什么“onesy.insert”调用需要比较器功能。我明白那个。它恰好是我在实际使用比较器的测试集中编写的第一个多映射操作。
我有各种预感,但我已经没有预感了,所以如果有人知道这些东西可以给我任何线索,我将非常感激。
规范