通用编程与概念冲突与复制构造函数

时间:2013-03-16 23:44:11

标签: c++ templates c++11 constructor concept

我正在尝试使用通用编码样式将受限概念API包装在通用堆栈上。 我遇到的问题是我的一个构造函数,即最重要的构造函数,它会覆盖我的复制构造函数。 我对这个类有一个要点,一些测试代码,以及我从编译器得到的错误:https://gist.github.com/biot023/5178831

我希望能够在我创建的堆栈中使用值语义,只需分配给它们的向量即可。但是,这给了我复制构造函数问题。

有人可以建议我怎样才能明确地触发复制构造函数(我只需要在我的测试代码中做),或者告诉我哪里出错了?

1 个答案:

答案 0 :(得分:1)

问题是你的构造函数模板比​​你的复制构造函数更好:

// Copy constructor
WrappedStack( const WrappedStack &other )

// Constructor template
template <typename S>
WrappedStack( S &stack )

当使用WrappedStack<T>类型的对象进行实例化(其中T模板参数)时,构造函数模板的实例化签名将如下所示:

WrappedStack( WrappedStack<T> &stack )

如果参数的类型不是const - 合格,则这比复制构造函数更好匹配,因为它不需要const转换。因此,构造函数模板将被重载决策选中,并且其实体将被实例化,从而导致您遇到的错误。

要强制编译器在适当的时候使用复制构造函数,在使用类型为WrappedStack<T>的对象或可隐式转换为{的类型实例化构造函数模板时,可以使用SFINAE导致替换失败{1}}。例如:

WrappedStack<T>

查看此succesfully compiling的实际示例。