我想知道产生此错误的确切编译器行为。
看看这段代码。
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
答案 0 :(得分:4)
所有使用过的函数必须在程序中只有一个定义,或者是内联的。通过在标题中放置非内联定义,您通常会得到多个定义,这是一个错误。
你可以:
inline
或函数模板和类定义中定义的成员函数是隐式内联的,这就是为什么类模板的构造函数没有类似的问题。
答案 1 :(得分:2)
当您将函数定义放在标题中时,包含该标题的每个翻译单元都会获得自己的函数定义。 One Definition Rule表示每个名称在整个程序中最多只能有一个定义。
但也有例外。在函数的情况下,如果函数被标记为inline
并且所有定义都包含相同的标记序列,则可以有更多定义。在类中定义的成员函数是隐式内联的,模板也是如此。
因此,除了您已经找到的解决方法之外,您还可以内联构建器标记:
inline Base_class::Base_class()
{
}
答案 2 :(得分:0)
具有非模板基类的模板类应该内联编写,以避免编译器混淆。所有核心逻辑都应该在基类中,而模板就是为了使构建更容易。
即
template<typename T>
class Temp_derived_class:Base_class
{
public:
Temp_derived_class()
{
i = new int[5];
}
int *i;
};