2

所以我有这段代码,为了方便起见,我希望它的构造函数的默认参数是 int 类型和 0。(我的项目的一个类中有更多参数,其中一个是可选的,我不想要两次编写构造函数,因为它很大)

class mama{
    public:
    template<typename x> mama(x i=int(0)){}
};

int main(){
    mama x;
}

这不起作用,因为它说它找不到构造函数,所以还有另一种方法可以做到这一点吗?

error: no matching function for call to ‘mama::mama()'
note: candidates are: mama::mama(const mama&)
4

3 回答 3

5

请注意,函数模板不允许使用默认模板参数。为什么不创建一个类模板?

template <class T=int>
class mama{
    public:
    mama<T>(T i=0){}
};

int main(){
    mama<> x; // no argument based template parameter deduction possible
}
于 2009-05-06T21:57:08.733 回答
3

将您的构造函数重构为私有初始化函数和包装构造函数,然后添加默认值,如下所示:

class mama {
  private:
    template<typename x> void init(x i) { /* ... */ }
  public:
    template<typename x> mama(x i) { init(i); }
    mama() { init((int)0); }
};
于 2009-05-06T21:56:49.763 回答
-1

默认值就像重载一样工作,所以......

class mama{
public:
    template<typename x> mama(x i){}
    mama(int i = 0) {}
};

当您创建不带参数的 mama 时,具有默认 int 的构造会在任何模板化构造函数之前匹配。

于 2009-05-07T02:59:56.790 回答