0

我想知道产生此错误的确切编译器行为。

看看这段代码。

class Base_class
{
public:
  Base_class();
};

Base_class::Base_class()
{
  //Here it says multiple definitions (If I define the contructor outside)
  //If I define this inside class no error 
  //Or if I make the base class templated no error
  //Also if this is in .cpp it works.
}

template<typename T>
class Temp_derived_class:Base_class
{
public:
  Temp_derived_class();

  int *i;
};

template<typename T>
Temp_derived_class<T>::Temp_derived_class()
{
  i = new int[5];
}

这里它说的是多个定义(如果我在外面定义了构造函数)如果我在类内部定义这个没有错误或者如果我使基类模板化没有错误如果这是在 .cpp 它工作。

干杯,CB

4

3 回答 3

4

所有使用的函数在程序中必须只有一个定义,或者是内联的。通过将非内联定义放在标题中,您通常会得到多个定义,这是一个错误。

您可以:

  • 声明构造函数inline,或
  • 将定义移动到源文件中,或
  • 将定义移动到类定义中。

类定义中定义的函数模板和成员函数是隐式内联的,这就是类模板的构造函数没有类似问题的原因。

于 2013-07-30T12:19:12.727 回答
2

当您将函数定义放在标头中时,包含该标头的每个翻译单元都会获得自己的函数定义。单一定义规则说每个名称在整个程序中最多可以有一个定义。

不过也有例外。在函数的情况下,如果函数被标记inline并且所有定义都由相同的标记序列组成,则可以有更多的定义。在类中定义的成员函数是隐式内联的,模板也是如此。

因此,除了您已经找到的解决方法之外,您还可以将构造函数标记为内联:

inline Base_class::Base_class()
{
}
于 2013-07-30T12:17:09.920 回答
0

具有非模板基类的模板类应内联编写以避免编译器混淆。所有核心逻辑都应该在基类中,并且模板只是为了使转换更容易。

IE

template<typename T>
class Temp_derived_class:Base_class
{
public:

    Temp_derived_class()
    {
      i = new int[5];
    }

  int *i;
};
于 2013-07-30T12:05:48.660 回答