0

可能重复:
为什么模板类的实现和声明应该在同一个头文件中?
模板类成员函数实现是否总是必须放在 C++ 的头文件中?

我在这里犯了一些愚蠢的错误,但我看不出是什么。

这编译:

//start of header.h
namespace ns
{
    class A
    {
    public:
        template <class t>t func();
    };
    template<class t> t A::func()
    {
        t a;
        return a;
    }
}
//end of header.h

//imp.cpp 的开始

//imp.cpp 结束

但以下没有:

//start of header.h
namespace ns
{
    class A
    {
    public:
        template <class t>t func();
    };
}
//end of header.h




//start of imp.cpp
#include "header.h"
using namespace ns;

template<class t> t A::func()
{
    t a;
    return a;
}

//imp.cpp 结束

错误是:错误LNK2019:函数_main中引用的未解析的外部符号“public:int __thiscall ns::A::func(void)”(??$func@H@A@ns@@QAEHXZ)

4

2 回答 2

2

模板必须在头文件中实现,因为它们在实例化之前无法编译。

看到这个答案: 为什么模板只能在头文件中实现?

于 2012-06-03T20:12:59.500 回答
1

您应该阅读将 C++ 模板函数定义存储在 .CPP 文件中。模板专业化还有其他情况 - 它更像普通函数(在 .hpp 中声明,在 .cpp 中定义)。如果您想在标题中进行专门化,您应该记住添加内联(因为 ODR)。

http://en.wikipedia.org/wiki/One_Definition_Rule[ODR][1]

于 2012-06-03T20:19:46.723 回答