我很困惑为什么需要这个或者我有其他错误导致我的问题。
我有一些基于模板的代码......
template <typename T>
class redblacknode{
private:
T value;
public:
int colour;
redblacknode* up;
redblacknode* left;
redblacknode* right;
redblacknode(T& v);
redblacknode(redblacknode* node);
redblacknode(redblacknode& node);
redblacknode* grandparent() const;
redblacknode* uncle() const;
redblacknode* sibling() const;
T& getvalue();
bool bothchildrenblack() const;
bool equals(redblacknode*) const;
bool lessthan(redblacknode*) const;
void assign(redblacknode*);
void showinorder(redblacknode*) const;
void showpreorder(redblacknode*) const;
void showpostorder(redblacknode*) const;
};
令人费解的是,如果我宣布一个我想在这里使用的课程......
class pagechain{
....
pagechain(long page);
....
};
pagechain::pagechain(long page)
{
pagenumber = page;
}
....
pagechain dummy = pagechain(initialvalue);
redblacknode<pagechain>(dummy);
此代码失败 - 说我需要明确初始化T
./redblack.hpp:31:3: error: constructor for 'redblacknode<pagechain>' must explicitly initialize the member 'value' which does not have a default constructor
redblacknode(T& v);
但是我为页链添加了一个愚蠢的构造函数......
pagechain(){};
代码编译......导致这种行为的原因/我出错了什么?
答案 0 :(得分:2)
虽然我无法看到构造函数redblacknode(T& v)
的代码,但我猜测它看起来如下所示:
template <typename T> redblacknode<T>::redblacknode(T& v) {
value = v;
}
这样做是调用T
的默认构造函数,然后为其赋值v
。你想要做的是使用初始化语句:
template <typename T> redblacknode<T>::redblacknode(T& v)
: value(v)
{
}
这样您就不需要默认构建value
,因为value
现在只需一步构建,而不是两步。
答案 1 :(得分:2)
编译器告诉您显式初始化value
(而不是T),请准确读取错误消息。
如果您声明成员变量
T value;
编译器希望为变量“value”生成初始化代码,作为redblacknode
的任何构造函数的一部分。当T
具有不带参数的ctor时,这会自动生效。如果没有这样的ctor(并且什么时候不提供ctor,那么pagechain
就没有了,因为你已经添加了带参数的ctor ,这会禁用自动生成的无参数ctor ),你可以提供一个明确的初始化,如
public redblacknode::redblacknode(T& v)
:value(0)
{
}
(你必须以这种方式实现所有redblacknode
构造函数。)