gcc 的确切错误消息是
error: 不能进行动态转换&n
(类型struct N*
) 输入void*
(源类型不是多态的)
这可以通过使用来处理boost::is_polymorphic
结合boost::enable_if
and boost::disable_if
,不幸的是 gcc 因明显的方法而窒息,所以这里是解决方法:
template <class T>
void* address_of_impl(T* p, boost::enable_if< boost::is_polymorphic<T>, int >)
{
return dynamic_cast<void*>(p);
}
template <class T>
void* address_of_impl(T* p, ...) { return static_cast<void*>(p); }
template <class T>
void* address_of(T* p) { return address_of_impl(p, 0); }
在我们使用 SFINAE 的地方(省略号始终被认为是重载解析中的最后一个,因此编译器首先尝试使用dynamic_cast
由于以下原因,该版本对于非多态类型失败enable_if
).
我在 gcc 3.4 上测试过,它通过了。我正在调查另一个问题 https://stackoverflow.com/questions/3491848/enable-if-disable-if-combination-provokes-an-ambiguous-call为什么使用disable_if
代替...
不起作用。
EDIT:
这是一个简单的错字(忘记了::type
bit):
template <class T>
typename boost::enable_if< boost::is_polymorphic<T>, void* >::type
address_of(T* p) { return dynamic_cast<void*>(p); }
template <class T>
typename boost::disable_if< boost::is_polymorphic<T>, void* >::type
address_of(T* p) { return static_cast<void*>(p); }