C++ 具有非模板基类的模板类

C++ 具有非模板基类的模板类,c++,C++,我想知道产生此错误的确切编译器行为 看看这个代码 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

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

看看这个代码

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];
}
class基类
{
公众:
基类();
};
基本类::基本类()
{
//这里有多个定义(如果我在外部定义构造函数)
//如果我在类内定义这个,就没有错误
//或者如果我使基类模板化没有错误
//如果这是在.cpp中,它也可以工作。
}
模板
类临时派生类:基本类
{
公众:
Temp_派生的_类();
int*i;
};
模板
Temp_派生类::Temp_派生类()
{
i=新整数[5];
}
这里有多个定义(如果我在外部定义构造函数) 如果我在类内定义这个,就没有错误 或者如果我使基类模板化没有错误 如果这是在.cpp中,它也可以工作

干杯,
CB

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

i、 e

模板
类临时派生类:基本类
{
公众:
临时派生类()
{
i=新整数[5];
}
int*i;
};

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

i、 e

模板
类临时派生类:基本类
{
公众:
临时派生类()
{
i=新整数[5];
}
int*i;
};

将函数定义放在标题中时,包含该标题的每个翻译单元都会获得自己的函数定义。声明说,在整个程序中,每个名称最多只能有一个定义

但也有例外。对于函数,如果函数被标记为
inline
,并且所有定义都由相同的标记序列组成,则可以有更多的定义。类中定义的成员函数是隐式内联的,模板也是隐式内联的

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

inline Base_class::Base_class()
{
}

将函数定义放入头中时,包含该头的每个翻译单元都会获得自己的函数定义。声明说,在整个程序中,每个名称最多只能有一个定义

但也有例外。对于函数,如果函数被标记为
inline
,并且所有定义都由相同的标记序列组成,则可以有更多的定义。类中定义的成员函数是隐式内联的,模板也是隐式内联的

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

inline Base_class::Base_class()
{
}

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

您可以:

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

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

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

您可以:

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

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

这与任何非内联、非模板函数类似:如果在标题中定义它,则会出现多个定义错误。模板只是一个分散注意力的东西,就像任何非内联、非模板函数一样:如果你在标题中定义它,你会得到多个定义错误。模板只是一种干扰。问题在于非模板构造函数。任何函数模板都是隐式内联的,因此不存在“编译器混淆”。问题在于非模板构造函数。任何函数模板都是隐式内联的,因此这里没有“编译器混淆”。只是强调一下,非-模板是否用作基础或其他什么都不重要。不管这个函数是内联的,内联的一种方法是在
类中定义
。只是该函数是否为内联函数,而内联的一种方法是在
类中定义。