模板化函数定义在单独的cpp文件中

时间:2012-06-03 20:11:03

标签: c++ templates

  

可能重复:
  Why should the implementation and the declaration of a template class be in the same header file?
  Do template class member function implementations always have to go in the header file in 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)

2 个答案:

答案 0 :(得分:2)

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

看到这个答案: Why can templates only be implemented in the header file?

答案 1 :(得分:1)

您应该阅读Storing C++ template function definitions in a .CPP file。还有模板特化的其他情况 - 它更像是普通函数(.hpp中的声明,.cpp中的定义)。如果你想在标题中有专门化,你应该记得添加内联(因为ODR)。

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