wocan23 2019-09-24 15:54 采纳率: 100%
浏览 548
已采纳

c++简单类模板报错问题

环境:clion mac

TmpOperator.h

#ifndef TEXT_TMPOPERATOR_H
#define TEXT_TMPOPERATOR_H

template <typename T>
class TmpOperator {
public:
     T& test1(T& t);
};


#endif //TEXT_TMPOPERATOR_H

TmpOperator.cpp

#include "TmpOperator.h"

template<typename T> T& TmpOperator<T>::test1(T& t) {
    return t;
}

main.cpp

#include <iostream>
using namespace std;
#include "TmpOperator.h"
int main() {

    TmpOperator<int> tmpOperator;
    int a = 1;
    int b = tmpOperator.test1(a);
    cout << b << endl;
}

看着代码没啥毛病啊,为啥报错啊

Scanning dependencies of target Text
[ 33%] Building CXX object CMakeFiles/Text.dir/main.cpp.o
[ 33%] Building CXX object CMakeFiles/Text.dir/TmpOperator.cpp.o
[ 50%] Linking CXX executable Text
Undefined symbols for architecture x86_64:
  "TmpOperator<int>::test1(int&)", referenced from:
      _main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [Text] Error 1
make[2]: *** [CMakeFiles/Text.dir/all] Error 2
make[1]: *** [CMakeFiles/Text.dir/rule] Error 2
make: *** [Text] Error 2
  • 写回答

2条回答 默认 最新

  • qtchen_1988 2019-09-24 16:15
    关注

    C++要求模板的声明和实现对引用者必须都可见,模板的声明和实现要放到一个文件里,都写在.h文件里

    你可以把

    template<typename T> T& TmpOperator<T>::test1(T& t) {
        return t;
    }
    

    移到头文件(.h) 或者 移到main.cpp

    或者在main.cpp 添加#include "TmpOperator.cpp"
    这种很少用,在这我只是说明,要让调用者可见

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同