模板和静态对象(未定义的引用和必需的引用)
templates and static objects (undefined reference & required from)
我正在使用模板和静态成员实现一些想法。虽然"真实的"代码会产生另一个错误,但这是我仍然在一个玩具示例代码
上的错误。#include <string>
#include <iostream>
template<int dim>
class Class1 {
public:
Class1() {};
~Class1() {};
void foo() {
std::cout<<"foo-1"<<std::endl;
}
protected:
std::string name;
};
template<int dim>
class Class2 : public Class1<dim>
{
public:
Class2(const int & a, const int &b) :
number( Class2<dim>::id_generator++ )
{
Class1<dim>::name = "My-name";
foo(); // (1)
};
void foo() {
Class1<dim>::foo();
std::cout<<"foo-2"<<std::endl;
}
private:
const unsigned int number;
static unsigned int id_generator;
};
int main()
{
int a = 1, b=2;
Class2<2> class2(a,b); // (2)
}
链接错误:
undefined reference to `Class2<2>::id_generator'
真实示例产生2个错误
(1) required from 'Class2<dim>::Class2(int, int) [with int dim = 3]'
(2) required from here.
现实生活中的错误根本没有告诉我任何东西!:(我希望,如果玩具问题得到解决,现实生活中的问题也会消失,但是,如果任何人对结构上下文中的"现实生活"错误(这两行)有任何想法,请告诉我。
您忘记为static
数据成员id_generator
添加定义了。在全局命名空间级别添加:
template<int dim>
unsigned int Class2<dim>::id_generator = 0;
有了这个附加功能,您可以看到您的代码在这里正确编译和链接。
正如错误消息所示,没有静态数据成员的定义。如果这是一个普通的类,您可以将定义放在源文件中:
// header:
class C {
static int i;
};
// source:
int C::i = 3;
模板是一个模式;编译器使用它来生成代码。因此,当编译器实例化模板时,您希望得到的结果与前面的代码类似。但是模板代码放在头文件中,而不是源文件中,所以你可以这样写:
// header:
template <class T>
class C {
static int i;
};
template <class T>
int C<T>::i = 3;
相关文章:
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 类 Referention 中C++回调函数引用非静态函数
- Qt 静态库未定义引用
- 非静态成员引用必须相对于特定对象
- 引用静态数据成员
- 初始化类C++私有属性(值/引用/静态)
- 如何在类静态成员中引用静态变量?
- 从Visual Studio 2017引用静态库有多简单?
- C++:引用静态库的静态库
- C++未定义的引用(静态成员)
- 无法获取库上的枚举(未定义的引用静态元对象)
- 取消引用静态变量时的链接错误
- 未定义的引用静态成员C++
- "Undefined reference"尝试引用静态字段
- 引用静态函数作为类定义的一部分是否有任何开销?
- 未定义的引用静态函数指针成员在c++,我做错了什么
- 未定义的引用静态成员变量
- 未定义的引用静态成员
- 如何从另一个类的结构中引用静态成员变量
- 本例中引用静态变量的引用返回是否安全?