以下代码重现了VS2005中的错误:我有一个像
这样的模板函数template <typename T> bool foo(T x, T y) {
struct bar {
public:
T t;
bool CompLT(const bar& that) {
return (this->t) < (that.t);
}
};
bar X, Y;
X.t = x;
Y.t = y;
return X.CompLT(Y);
}
在头文件 A.h 中。当我现在在两个编译单元中使用头文件 B.cpp 和 C.cpp 时,VS2005抱怨错误
error LNK2005: "public: bool __thiscall `bool __cdecl foo<float>(float,float)'::`2'::bar::CompLT(struct `bool __cdecl foo<float>(float,float)'::`2'::bar const &)" (?CompLT@bar@?1???$foo@M@@YA_NMM@Z@QAE_NABU1?1???$foo@M@@YA_NMM@Z@@Z) is already defined in B.obj .
如何修复此错误?这是VS2005的问题还是我必须将结构的定义移出局部函数范围并使其成为模板?
答案 0 :(得分:0)
答案 1 :(得分:0)
从评论中可以看出,这是VS2005中的一个错误。由于没有人能够对问题的确切来源提供一些见解,我将提供我的解决方案:我将函数移动到静态模板类中,并将内部结构定义为该类模板中的私有局部。