【问题标题】:Undefine reference to... : inheritance from a template class对...的未定义引用:从模板类继承
【发布时间】:2012-10-09 09:49:23
【问题描述】:

我在从模板类继承时遇到了一些问题。下面的代码没有编译,显示这个错误:main.cpp : undefined reference to OBJ1<1000>::method()

parent.h

template <int nb>
class PARENT
{
  PARENT() {};
  ~PARENT() {};

  virtual void method() = 0;
  enum { nb_ = nb };
};

obj1.h

#include "parent.h"

template <int nb>
class OBJ1 : public PARENT<nb>
{
  virtual void method();
};

obj1.cpp

#include "obj1.h"

template <int nb>
void OBJ1<nb>::method()
{
  //code
}

ma​​in.cpp

#include "obj1.h"

int main()
{
  OBJ1<1000> toto;
  toto.method();
}

我哪里错了?

【问题讨论】:

    标签: c++ templates inheritance


    【解决方案1】:

    在处理模板时,您不能将声明和实现拆分为单独的文件。请参阅this question 了解原因(以及解决此问题的更简洁的描述)。

    这个需要合并(你也可以#include把实现文件放到头部让预处理器来合并):

    // obj1.hpp
    
    #include "parent.h"
    
    template <int nb>
    class OBJ1 : public PARENT<nb>
    {
      virtual void method();
    };
    
    template <int nb>
    void OBJ1<nb>::method()
    {
      //code
    }
    

    【讨论】:

    • 代码仍然无法编译,但您修复了一个错误。 :) 谢谢。
    • 当您像这里所做的那样为类模板定义一个方法时,最好将其标记为inline。如果没有那个inline,如果多个源文件将那个函数用于相同的模板参数,就会违反一个定义规则。
    • @DavidHammen 模板没有例外吗?另请参阅stackoverflow.com/q/3694899/1025391
    • 没有例外。它与(非模板)类相同。如果在类内部定义函数,默认情况下该函数是内联的。行中定义的函数不需要inline 关键字,因为它已经是内联的。默认情况下。您将定义与声明分开。与类相同的规则适用:如果您没有使用 inline 关键字限定一个不符合规定的定义,则该函数不是 inline 函数。在 C++ 中,inline 的主要目的是针对单一定义规则。函数可能被内联;这只是一个提示。
    猜你喜欢
    • 1970-01-01
    • 2014-09-24
    • 2018-05-23
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2016-08-02
    相关资源
    最近更新 更多