代码:
#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错误吗?
答案 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_wrapper
即Test
的模板参数),因此它尝试形成函数类型Test()
,它使用按值Test
返回类型,对于不完整或抽象类型无效。我想我已经在std::reference_wrapper
年前解决了这个问题,需要使用result_of<_M_func_type&(Args...)>
。
libstdc ++中的TR1实现不再真正维护 - TR1达到了它的目的,但它已经过去了。