在另一个.cpp文件中用模板类链接多个文件

时间:2018-12-06 07:19:08

标签: c++ templates linker

我正在学习模板编程,遇到一个我无法理解的错误。我的任务涉及3个文件 1)主文件(具有主功能)

#include<iostream>
#include "templates.h"
int main(){
trial <int>x;
x.input(3);
std::cout<<x.ret();

return 0;
}

2)标头文件

#ifndef templ
#define templ
template<typename T>
class trial{
  T val;
public:
  void input(T x);
  T ret();
};
#include "templateref.cpp"
#endif

3)使用的.cpp文件定义了类试用版的功能

#ifndef templ
#define templ
#include"templates.h"
#endif
template<class T>
void trial<T>::input(T x){
  val = x;
  return ;
}

template<class T>
T trial<T>::ret(){
  return val;
}

由于我不了解"Undefined reference to" template class constructorhttps://www.codeproject.com/Articles/48575/How-to-define-a-template-class-in-a-h-file-and-imp,因此我不得不实例化模板类才能使其正常工作。

我尝试编译它时出现了问题。

clang++ templates.cpp templateref.cpp -Wall -o template

我得到了错误

templateref.cpp:14:6: error: variable has incomplete type 'void'
void trial<T>::input(T x){
     ^
templateref.cpp:14:11: error: expected ';' at end of declaration
void trial<T>::input(T x){
          ^
          ;
templateref.cpp:14:11: error: expected unqualified-id
templateref.cpp:20:11: error: qualified name refers into a specialization of variable template 'trial'
T trial<T>::ret(){
  ~~~~~~~~^
templateref.cpp:14:6: note: variable template 'trial' declared here
void trial<T>::input(T x){
     ^
4 errors generated.

此问题由

修复
clang++ templates.cpp -Wall -o template

编译运行没有错误,并给出了预期的结果。

所以我的问题是(很长的解释,很抱歉,因为我无法用简短的词来解释我的问题),为什么我不能将这些文件链接在一起?我丢失了什么?

1 个答案:

答案 0 :(得分:1)

您不应该编译成员定义文件-它已经包含在头文件中。

由于该文件中的包含保护,编译器在处理它时会排除整个标头,并且类模板定义不存在。

只需编译主文件。