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
c++

2个回答

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

你可以把

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

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

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

qtchen_1988
qtchen_1988 回复wocan23: 我举了三种情况,你都去验证一下,不要光听别人的,自己敲,编译才是最主要的。大家共勉吧!
4 个月之前 回复
wocan23
wocan23 我把他写到头文件里面好使了,网上文档都没有提到您说的可见,还是得多看书啊,谢谢了
4 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问