这是我的代码段
// test.cpp
#include <iostream>
#include "test.h"
int main(){
Test<int> test = Test<int>();
test.add(1);
test.print();
}
// test.h
#ifndef TEST
#define TEST
template <typename T> class Test{
public:
T info;
void print();
void add(T i);
};
#endif
// testT.cpp
#include <iostream>
#include "test.h"
template<typename T> void Test<T>::print()
{
std::cout << info << std::endl;
}
template<typename T> void Test<T>::add(T i)
{
info = i;
}
然后我运行这个exec
g++ -c testT.cpp && g++ test.cpp -o a.out testT.o
我收到此错误
Undefined symbols for architecture x86_64:
"Test<int>::add(int)", referenced from:
_main in test-e89092.o
"Test<int>::print()", referenced from:
_main in test-e89092.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation) // in my macOS
我想在头文件中声明模板类,并在其他文件中定义方法,因此,如果我更改模板类中方法的定义,则仅编译定义方法文件而不是头文件。我该怎么办?
答案 0 :(得分:0)
将模板分隔为cpp和标头的一种可行方法是从定义函数体的源代码将其typedef定义为正在使用的类型。
例如:在您的代码中,如果要在testT.cpp的底部添加一个typedef Test<int> __UNUSED_TEMP_INT__;
,它将在可以识别正文的位置为int
进行编译。但您只能将模板用于int
。
其他选项是包括标头中的源,但是cpp只是另一个标头。