修改 感谢用户Richard Critten,此问题归结为模板,以及我对其工作原理的理解。我不得不将函数实现移动到类头中,否则它们不会被编译为某种任意类型。见Why can templates only be implemented in the header file?
我正在编写一个模板类Tensor
,它可以被初始化以保存T
类型的元素,其构造函数需要一些参数。
我发现如果我尝试在任何其他文件中创建类Tensor
的对象,它将失败并显示undefined reference
。我确保我正确地包含了标题,甚至创建了一个与名为test_boi()
的类无关的函数,可以被其他文件成功调用。
我不会详细介绍我的测试设置,但我有一个包含3个文件的MWE:tensor.cpp
,tensor.h
和main.cpp
。在tensor.cpp
我有一个main()
,在取消注释时可以使用。它与main.cpp
中的undefined reference
相同,但tensor.h
错误失败。
对于构建(使用CMake),我使用tensor.cpp
和test_boi()
创建一个库并将其添加到我的可执行文件中。我想这可能是我的问题,但我不确定我做错了什么。制作图书馆是我刚开始做的事情,那里有大量的信息。
我可以从Main.exe
调用tensor.cpp
(当我不创建对象时)告诉我Main.exe
已经编译,并且main()
可以访问}}。当我将tensor.cpp
放入add_library (libTensor tensor.h tensor.cpp)
add_executable(Main.exe test_main.cpp)
target_link_libraries(Main.exe libTensor)
#add_executable (Tensor.exe tensor.cpp)
#target_link_libraries (Tensor.exe Tensor)
时,我可以创建这些对象这一事实告诉我,我的课程中没有任何内容。 “未定义的引用”stackoverflow帖子很猖獗,所以我找不到符合我特定问题的任何内容。
我的CMake脚本的相关部分
tensor.h
我的班级定义(#ifndef TENSOR_H
#define TENSOR_H
#include <vector>
template<typename T>
class MyClass
{
int width, height;
public:
MyClass(int n, int m)
{
height = n;
width = m;
};
MyClass(int n, int m, std::vector<T> elems);
};
int test_bois();
#endif
)
tensor.cpp
我的函数实现(#include <iostream>
#include "tensor.h"
template<typename T>
Tensor<T>::Tensor(int n, int m)
{
// shape = (height, width);
height = n;
width = m;
}
template<typename T>
Tensor<T>::Tensor(int n, int m, std::vector<T> elems)
{
// shape = (height, width);
height = n + 100;
width = m + 100;
}
int test_bois()
{
return 42;
}
// int main()
// {
// std::vector<int> elems(10);
// int height = 2;
// int width = 2;
// Tensor<int> *my_obj_zero = new Tensor<int>(height, width);
// Tensor<int> *my_obj_one= new Tensor<int>(height, width, elems);
// std::cout << my_obj_zero->shape() << std::endl;
// std::cout << my_obj_one->shape() << std::endl;
// std::cout << "Hello World!!" << std::endl;
// return 0;
// }
)
```
main.cpp
#include <iostream>
#include "tensor.h"
int main()
{
std::cout << test_boi() << std::endl;
// this block commented out to get successful run
std::vector<int> elems(10);
int height = 2;
int width = 2;
Tensor<int> *my_obj_zero = new Tensor<int>(height, width);
Tensor<int> *my_obj_one= new Tensor<int>(height, width, elems);
std::cout << my_obj_zero->shape() << std::endl;
std::cout << my_obj_one->shape() << std::endl;
std::cout << "Hello World!!" << std::endl;
return 0;
}
NOT EXISTS