3

以下代码重现了我在 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); 
}

在头文件Ah . 当我现在在两个编译单元B.cppC.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的问题还是我必须将结构的定义移出本地函数范围并使其成为模板?

4

2 回答 2

0

你用过包括警卫吗?

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

#ifndef A_H
#define A_H

//your header

#endif
于 2013-10-21T08:55:37.460 回答
0

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

于 2013-11-04T13:48:01.453 回答