我正在尝试使用通用编码样式将受限概念API包装在通用堆栈上。 我遇到的问题是我的一个构造函数,即最重要的构造函数,它会覆盖我的复制构造函数。 我对这个类有一个要点,一些测试代码,以及我从编译器得到的错误:https://gist.github.com/biot023/5178831
我希望能够在我创建的堆栈中使用值语义,只需分配给它们的向量即可。但是,这给了我复制构造函数问题。
有人可以建议我怎样才能明确地触发复制构造函数(我只需要在我的测试代码中做),或者告诉我哪里出错了?
答案 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的实际示例。