2

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

我希望能够将值语义与我创建的堆栈一起使用,我可以在将其分配给它们的向量时使用。但是,这给了我复制构造函数的问题。

谁能建议我如何显式触发复制构造函数(我只需要在我的测试代码中这样做),或者告诉我哪里出错了?

4

1 回答 1

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 在使用 类型或可隐式转换为 的类型的对象实例化构造函数模板时导致替换失败WrappedStack<T>。例如:

#include <type_traits>

template<
    typename S,
    typename std::enable_if<
        !std::is_convertible<S, WrappedStack<T> const&>::value
        >::type* = nullptr>
WrappedStack( S &stack ) : __stack( new wrapped_stack_t<S, T>( stack ) ) {}

查看此成功编译的实时示例。

于 2013-03-16T23:55:32.090 回答