gpt4 book ai didi

c++ - 概念与复制构造函数冲突的泛型编程

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:28:33 27 4
gpt4 key购买 nike

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

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

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

最佳答案

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

// Copy constructor
WrappedStack( const WrappedStack &other )

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

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

WrappedStack( WrappedStack<T> &stack )

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

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

查看此 succesfully compiling 的实例.

关于c++ - 概念与复制构造函数冲突的泛型编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15456043/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com