C++ template 声明与定义

今天编码的时候,发现了一个错误,就是模板代码在连接的时候找不到方法。函数

状况大概以下:this

在 "Manager.h" 中编码

class Manager {spa

public:编译器

  template<typename T>io

  void SetData(const T& value);编译

};function

而后在cpp文件中定义SetData模板

template<typename T>class

void Manager::SetData(const T& value) {

}

在另一个main.cpp文件中使用

#include "Manager.h"

Manager mgr;

double n = 0;

mgr.SetData(n);

这样就会产生一个error LNK2019:没法解析的外部符号 “public: void __thiscall Manager::SetData<double>(const double&)” xxxx,该符号在 xx函数中被引用的连接错误。查了一下书籍,错误的缘由在于,function template SetData(const T&)的定义没有具现化,Manager.h和Manager.cpp是分开编译的,在编译main.cpp的过程当中,编译器假设这个template的定义在某个地方,于是只生成一个对该定义的reference,并将这个reference所指的定义式留给连接器去决议,可是在连接期间,又找不到这样一个定义。

Note:奇怪的是,若是n是int类型,又能够编译成功,可是回家后,我用本身的电脑试了一下,VS2008,int类型的也不行

解决这个问题有几个方法:

1)采用置入式。也就是定义也放在头文件中

2)显示具现化一份声明。

即在cpp文件中声明以下 template void Manager::SetData(const double&); ,这样作就要为每个类型作一份声明,比较繁琐

3)采用export关键字。它会export出除inline以外的其余方法

export template <typename T>

class Manager {

public:

  void SetData(const T&); //这个声明就会被export

  void Print() {}; //不会被export

};

相关文章
相关标签/搜索