C++0x 错误:使用 std::shared_ptr 重载函数到 const 参数不明确

2023-11-24

假设我有两个无关A and B。我也有课Bla使用boost::shared_ptr像这样:

class Bla {
public:
    void foo(boost::shared_ptr<const A>);
    void foo(boost::shared_ptr<const B>);
}

注意const。这是这个问题的原始版本所缺少的重要部分。可以编译,并且以下代码可以工作:

Bla bla;
boost::shared_ptr<A> a;
bla.foo(a);

但是,如果我不再使用boost::shared_ptr使用std::shared_ptr在上面的示例中,我收到一个编译错误:

"error: call of overloaded 'foo(std::shared_ptr<A>)' is ambiguous
note: candidates are: void foo(std::shared_ptr<const A>)
                      void foo(std::shared_ptr<const B>)

你能帮我弄清楚为什么编译器无法弄清楚在 std::shared_ptr 情况下使用哪个函数,而在 boost::shared_ptr 情况下却可以?我使用的是 Ubuntu 11.04 软件包存储库中的默认 GCC 和 Boost 版本,目前是 GCC 4.5.2 和 Boost 1.42.0。

这是您可以尝试编译的完整代码:

#include <boost/shared_ptr.hpp>
using boost::shared_ptr;
// #include <memory>
// using std::shared_ptr;

class A {};
class B {};

class Bla {
public:
    void foo(shared_ptr<const A>) {}
    void foo(shared_ptr<const B>) {}
};

int main() {
    Bla bla;
    shared_ptr<A> a;

    bla.foo(a);

    return 0;
}

顺便说一句,这个问题促使我问这个问题关于我是否应该使用std::shared_ptr还没有;-)


shared_ptr有一个模板单参数构造函数,这里考虑将其用于转换。这就是允许实际参数的原因shared_ptr<Derived>供应的地方shared_ptr<Base>是需要的。

既然两者shared_ptr<const A> and shared_ptr<const B>有这种隐式转换,它是不明确的。

至少在 C++0x 中,标准要求shared_ptr使用一些 SFINAE 技巧来确保模板构造函数仅匹配实际可以转换的类型。

签名是(参见部分[util.smartptr.shared.const]):

shared_ptr<T>::shared_ptr(const shared_ptr<T>& r) noexcept;
template<class Y> shared_ptr<T>::shared_ptr(const shared_ptr<Y>& r) noexcept;

要求:第二个构造函数不应参与重载决策,除非Y*可以隐式转换为T*.

可能该库尚未更新以符合该要求。您可以尝试更新版本的 libc++。

Boost 不起作用,因为它缺少这个要求。

这是一个更简单的测试用例:http://ideone.com/v4boA(此测试用例将在符合标准的编译器上失败,如果编译成功,则意味着原始用例将被错误地报告为不明确。)

VC++ 2010 正确无误(对于std::shared_ptr).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++0x 错误:使用 std::shared_ptr 重载函数到 const 参数不明确 的相关文章

随机推荐

  • 警告:组件“sparks.component.TextInput”不支持 CSS 类型选择器

    我正在尝试做一个简单的 CSS 声明 但是 我收到了上面的警告 不知道如何解决 我认为 s type 应该为我声明样式
  • Beautifulsoup 通过
    分割标签中的文本

    是否可以通过 br 标签将文本与标签分开 我有这个标签内容 u 420 777 593 531 br u 420 776 593 531 br u 420 775 593 531 我只想得到数字 有什么建议吗 EDIT x for x in
  • 不出现对话框

    我使用以下代码 public class Settings extends Activity implements OnClickListener private Activity activity private AlertDialog
  • 在闪亮的应用程序中以模式显示 dataTableOutput

    伟大的 R 社区 我只是想知道是否可以显示DT dataTableOutput在模式中按下操作按钮 例如 数据表输出如下所示 下面是一些代码 app R library shiny library shinydashboard ui lt
  • 扩展巴科斯-诺尔范式的运算顺序

    我正在为一种非常简单的规则语言创建正式规范 非常简单 我想使用 EBNF 因为这是一个标准 但我不知道如何指定操作顺序 这是到目前为止的规范 rule statement AND OR statement variable alphabet
  • 在 Symfony 中禁用特定操作的 CSS 样式表

    有没有办法在 view yml 中为 Symfony 中的特定操作禁用样式表 例如 我的 view yml 中有这样的内容 default stylesheets default css 我希望能够做类似的事情 displaySuccess
  • 在代理后面运行 keycloak 时令牌颁发者无效

    我已将 keycloak 服务器放在 apache 代理后面 ProxyRequests On ProxyVia On ProxyPreserveHost On SSLProxyEngine On SSLProxyCheckPeerCN o
  • 为什么神经网络的权重应该初始化为随机数? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在尝试从头开始构建一个神经网络 所有人工智能文献都一致认为 权重应该初始化为随机数 以便网络更快地收敛 但为什么神经网络初始权重被初始化为随机数呢 我在某处读到这样做是为了 打破
  • 如何使用 Perl 修改现有的 Excel 工作簿?

    With Spreadsheet WriteExcel 我可以创建一个新的工作簿 但是如果我想打开现有的工作簿并修改某些列怎么办 我将如何实现这一目标 我可以使用以下方法解析工作表中的所有数据Spreadsheet ParseExcel然后
  • Magento - 检索具有特定属性值的产品

    在我的块代码中 我尝试以编程方式检索具有特定值属性的产品列表 或者 如果不可能 如何检索所有产品 然后过滤它们以仅列出具有特定属性的产品 如何使用标准布尔过滤器执行搜索AND or OR匹配我的产品的子集 几乎所有 Magento 模型都有
  • 什么是“索引超出范围”异常,如何修复它? [复制]

    这个问题在这里已经有答案了 我收到以下错误之一 索引超出范围 必须为非负数且小于集合的大小 插入索引超出范围 必须为非负值且小于或等于大小 指数数组的边界之外 这是什么意思 我该如何解决 See Also 索引超出范围异常 参数超出范围异常
  • UITableViewCell 单击展开

    假设我们有一个自定义的 UITableViewCell 因此 每当我单击单元格上的自定义按钮时 它应该扩展到一定程度 你可以说40多高度 当我再次单击同一个自定义按钮时 它应该折叠到之前的高度 开发人员请指导我 我怎样才能完成这个任务 我不
  • iOS:从 NSString(html 字符串)中剥离

    所以我有一个NSString这基本上是一个html与所有平常的字符串html元素 我想做的具体事情是把它从所有的img tags The img标签可能有也可能没有最大宽度 样式或其他属性 所以我不知道它们的长度 他们总是以 gt 我怎么能
  • 仍然需要对 FCGI 使用“状态:404 未找到”吗?

    通常 当从 PHP 发送 http 状态标头时 会发送如下 HTTP 标头 header HTTP 1 0 404 Not Found 但是 那PHP手册表示对于 FCGI 主机 需要发送一个 状态 标头 然后由 FCGI 模块将其转换为
  • Lucene 区分大小写和不区分大小写的搜索

    我有一个 Lucene 索引 目前区分大小写 我想添加option将不区分大小写的搜索作为后备 这意味着与案例匹配的结果将获得更大的权重并且将首先出现 例如 如果结果数限制为 10 个 并且有 10 个匹配项与我的情况匹配 这就足够了 如果
  • Linq:获取 DataContext 中所有表的列表

    我有一个包含 100 多个表的 DataContext Linq to Sql 是否可以获取所有这些表的列表并将它们打印到控制台 这可能是一个愚蠢的问题 Thanks 它比上面容易得多 并且不需要反思 Linq to SQL 有一个 Map
  • 是否有一种 Java 方法可以将参数集合编码为 URL 查询组件?

    是否有一个广泛使用的 Java 库可以执行类似的操作dojo objectToQuery 做 例如 假设使用HttpCore的HttpParams对象 但任何键值映射都可以 HttpParams params new BasicHttpPa
  • 播放2.1 SSL配置

    我是 Play 新手 正在为生产配置 SSL 我可以使用自签名证书在开发模式下成功运行 但是当我尝试使用签名证书时 初始客户端握手失败并且 Play 生成以下堆栈跟踪 play Error loading HTTPS keystore fr
  • 使用贝塞尔曲线的圆近似

    我有两个关于贝塞尔曲线的问题 以及使用它们来近似圆的部分 给定单位圆弧 1 0 gt cos a sin a 其中 0 如果我们有一个仿射变换 A 它将圆弧旋转 椭圆弧将变换后的控制点 Ap0 Ap1 Ap2 Ap3 定义 椭圆弧的良好贝塞
  • C++0x 错误:使用 std::shared_ptr 重载函数到 const 参数不明确

    假设我有两个无关类A and B 我也有课Bla使用boost shared ptr像这样 class Bla public void foo boost shared ptr