我不确定如何解释它,因为我真的不知道正确的术语,但是这里有一个例子:
template <typename T>
struct PointerWrapper {
T *ptr;
};
struct Base {};
struct Derived : public Base {};
void test(PointerWrapper<Base>) {}
int main() {
PointerWrapper<Derived> p;
test(p);
return 0;
}
由于“派生”是从“基础”派生的,并且“PointerWrapper”结构仅适用于指向模板指定类型的指针,因此这没有任何问题。但是编译器抱怨:
asdfg.cpp:15:11: error: could not convert ‘p’ from ‘PointerWrapper<Derived>’ to ‘PointerWrapper<Base>’
我什至尝试了
test(reinterpret_cast<PointerWrapper<Base>>(p))
,但是它说:asdfg.cpp:15:51: error: invalid cast from type ‘PointerWrapper<Derived>’ to type ‘PointerWrapper<Base>’
所以我该怎么做?
最佳答案
尽管PointerWrapper<Base>
和PointerWrapper<Derived>
之间存在关系,但Base
和Derived
是完全不同的类型。
如果要允许传递任何PointerWrapper<>
,请执行以下操作:
template<typename T>
void test(PointerWrapper<T>)
{ }
如果只允许
PointerWrapper<T>
源自T
的Base
实例,请执行以下操作:template<typename T>
void test(
PointerWrapper<T>,
typename std::enable_if<std::is_base_of<Base, T>::value, void*>::type = 0
)
{ }
如果您使用的是C++ 03,则将
std::
替换为boost::
并摆脱::value
。