未定义的引用错误
undefined reference error
我有以下简单的模板代码:
#ifndef CLUSTER_H
#define CLUSTER_H
#include <iostream>
#include <vector>
template <typename T, size_t K>
class Cluster
{
public:
void Print() const;
private:
std::vector<T> objects;
};
template <typename T, size_t K>
void Cluster<T,K>::Print() const
{
for (int i=0; i<objects.size(); i++)
{
T curr=objects[i];
std::cout << curr << " ";
}
std::cout << std::endl;
}
#endif
由于某种原因,我收到以下错误:"未定义对'Cluster<int, 5u>::Print() const
'的引用。可能是什么原因造成的?谢谢!
所以,我要在这里冒昧地说,你已经在 CPP 文件中定义了一个模板函数,这意味着它最终将出现在不同的翻译单元中。下面是一个简单的示例:
标头,示例.h
#ifndef EXAMPLE_H
#define EXAMPLE_H
template<int TValue>
class example
{
public:
int get_tvalue();
};
#endif
源文件,例如.cpp
#include "example.h"
template<int TValue>
int example<TValue>::get_tvalue()
{
return TValue;
}
另一个源文件,主文件.cpp
#include "example.h"
int main()
{
example<5> instance;
instance.get_tvalue();
return 0;
}
如果我使用 GCC 将这些编译在一起,我会得到undefined reference to 'example<5>::get_tvalue()'
.这是因为模板类的实例化方式。模板类定义就是这样...模板,而不是实际类。当该类的参数化(或具体而言,完全专用)定义发生时,将创建实际的类定义,在本例中为 example<5>
。这种完全专业化的类定义只存在于主要.cpp...示例中没有这样的类.cpp!示例.cpp仅包含模板,不包含专用项。这意味着函数,get_tvalue
没有为 main.cpp 中的example<5>
定义,因此错误。
您可以通过以下两种方式之一解决此问题。第一种方法是始终在其头文件中定义整个模板类。例如,这是使用 STL 容器完成的方式。另一种方法是在示例中强制创建参数化类.cpp...您可以通过添加
template class example<5>;
到示例的末尾.cpp。因为现在在 example.cpp 中有一个实际的 example<5>
类定义,所以你还将得到一个example<5>::get_tvalue
的实际函数定义,当你的翻译单元 main.o 和 example.o 在编译步骤结束时链接在一起时,一切都会好起来的。
显然,在大多数情况下,这将是一种糟糕的方法,但是在模板参数仅取一小部分值的情况下,它可以工作。不过,将整个类放在头文件中可能是最简单、最安全和最灵活的。
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- C++引用错误
- 已定义函数时出现 G++ "未定义的引用"错误
- 错误:使用通用引用的声明冲突
- 链接 cmake 时出现未定义的引用错误
- 错误:未定义对'oboe::AudioStreamBuilder::openStream(oboe::AudioStream**)'的引用
- 链接器错误:未定义对"Reference_Genome::seq[abi:cxx11]"的引用
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 运行时错误:引用绑定到类型为"int"的空指针
- 隐式重新解释引用时强制转换,没有警告/错误
- 只有级联分类器会发出未定义的引用错误
- 错误:未定义对cv::cudacodec::createVideoReader的引用
- 模板流运算符重载错误:引用初始化无效,与basic_istream和basic_ifstream之间的差异有关
- 对于我的 ComplexNumber 中的某些方法,我得到了一个奇怪的未定义错误引用.cpp,不过我对模板很陌生
- 从对象调用成员对象,错误:引用非常量值的初始值必须是左值
- Qt并发错误:引用非静态成员