模板和静态对象(未定义的引用和必需的引用)

templates and static objects (undefined reference & required from)

本文关键字:引用 静态 对象 未定义      更新时间:2023-10-16

我正在使用模板和静态成员实现一些想法。虽然"真实的"代码会产生另一个错误,但这是我仍然在一个玩具示例代码

上的错误。
#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;