-2

代码:

    #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 错误吗?

4

1 回答 1

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_wrapper即 ie的模板参数Test),因此它尝试形成函数 type Test(),该函数使用按值Test返回类型,对于不完整或抽象类型无效。我想我std::reference_wrapper很久以前就解决了这个问题,它需要使用result_of<_M_func_type&(Args...)>.

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

于 2013-09-23T13:02:36.277 回答