当前位置:  开发笔记 > 编程语言 > 正文

将std :: tr1 :: shared_ptr与std :: function/std :: bind混合会导致编译器错误与更新的gcc

如何解决《将std::tr1::shared_ptr与std::function/std::bind混合会导致编译器错误与更新的gcc》经验,为你挑选了1个好方法。

我需要使用一些旧的遗留代码std::tr1::shared_ptr.我需要包含的标题包含#include #include .在我的代码我想用std::functionstd::bind,因为我们的编译器支持这些.

这适用于gcc 4.6.3和4.7.3.在4.9.2,5.1.x和5.2.0中,这会导致编译器错误.它似乎是由于-include 而发生的.

我写了一个重现这个问题的小例子:

#include 
#include 
#include 

struct Foo {
    void test(std::tr1::shared_ptr i) {}
};

int main() {
    Foo f;
    std::function)> func = std::bind(&Foo::test, f, std::placeholders::_1);

    return 0;
}

gcc-4.6.3,没有#include ,编译好.在我的本地机器上测试过.

gcc-4.6.3,用#include ,编译好.在我的本地机器上测试过.

gcc-5.1,没有#include ,编译OK:http://ideone.com/XrkAXT

gcc-5.1,带#include 编译器错误:http://ideone.com/sRWQLn

我没有使用任何std::tr1::function或根本没有std::tr1::bind,我从遗留代码中使用的唯一东西是一个std::tr1::shared_ptr对象.

为什么#include 影响非tr1 std::function/ std::bind?或者这里发生了什么?

编辑:根据GNU C++ Library Manual,第3章:" 第二条规则的一个特例是TR1和C++ 11设施的混合.有可能(虽然不是特别谨慎)包括TR1版本和C++ 11版本的标题在同一翻译单元中 "



1> T.C...:

标准有一个变化,需要实现约束std::function的构造函数,以便它不能从阳光下的所有东西转换,而只能从实际的callables转换,所以libstdc ++计算返回类型:

template
using _Invoke = decltype(__callable_functor(std::declval<_Functor&>())
                         (std::declval<_ArgTypes>()...) );

并在SFINAE中使用它.表达式SFINAE意味着如果调用表达式不编译,则转换构造函数将从重载集中删除.

问题在于此__callable_functor.它的工作是将指针指向成员,以便它们可以与普通的函数调用语法一起使用.它是一个保留的名称,所以没有其他人应该使用它...好吧,除了标准库的其他组件.我们已经std::__callable_functorstd::tr1::__callable_functor.因为std::tr1是一个关联的命名空间(由于std::tr1::shared_ptr在签名中的使用Foo::test),你最终会产生歧义.

编辑:报告为错误68995.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有