模板函数中的本地结构

时间:2013-10-17 12:06:27

标签: c++ templates visual-studio-2005

以下代码重现了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的问题还是我必须将结构的定义移出局部函数范围并使其成为模板?

2 个答案:

答案 0 :(得分:0)

您使用过include guards吗?

尝试添加以下内容并删除任何目标文件(以.o结尾)

#ifndef A_H
#define A_H

//your header

#endif

答案 1 :(得分:0)

从评论中可以看出,这是VS2005中的一个错误。由于没有人能够对问题的确切来源提供一些见解,我将提供我的解决方案:我将函数移动到静态模板类中,并将内部结构定义为该类模板中的私有局部。