tr1 ::与g ++ 4.8.1的功能错误

时间:2013-09-23 12:00:27

标签: c++ c++11 tr1 g++4.8

代码:

    #include <tr1/functional>

    class Test
    {
    public:
        Test() { ; }
        virtual void foo() = 0;
    };

    void someFunc(Test& j)
    {
        j.foo();
    }

    void func(Test& j)
    {
       std::tr1::bind(someFunc, std::tr1::ref(j));
    }

在Linux上使用g ++ 4.8.1,使用--std=c++11进行编译我得到:

    In file included from foo.cpp:1:0:
    /usr/include/c++/4.8.1/tr1/functional: In instantiation of ‘class std::tr1::reference_wrapper<Test>’:
    foo.cpp:17:44:   required from here
    /usr/include/c++/4.8.1/tr1/functional:495:9: error: cannot allocate an object of abstract type ‘Test’
             operator()(_Args&... __args) const
             ^
    foo.cpp:3:7: note:   because the following virtual functions are pure within ‘Test’:
     class Test
           ^
    foo.cpp:7:18: note:     virtual void Test::foo()
         virtual void foo() = 0;
                      ^

这似乎没有任何意义。使用相应的boost类工作正常。有人可以确认这是G ++ 4.8.1中的TR1错误吗?

1 个答案:

答案 0 :(得分:2)

libstdc ++ tr1::reference_wrapper实现具有:

  template<typename... _Args>
    typename result_of<_M_func_type(_Args...)>::type
    operator()(_Args&... __args) const
    {
      return __invoke(get(), __args...);
    }

result_of表达式使用按值_M_func_type参数(reference_wrapperTest的模板参数),因此它尝试形成函数类型Test(),它使用按值Test返回类型,对于不完整或抽象类型无效。我想我已经在std::reference_wrapper年前解决了这个问题,需要使用result_of<_M_func_type&(Args...)>

libstdc ++中的TR1实现不再真正维护 - TR1达到了它的目的,但它已经过去了。