C ++模板需要一个空构造函数

时间:2014-02-10 21:34:40

标签: c++ templates constructor

我很困惑为什么需要这个或者我有其他错误导致我的问题。

我有一些基于模板的代码......

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(){};

代码编译......导致这种行为的原因/我出错了什么?

2 个答案:

答案 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构造函数。)