我不确定如何解释它,因为我真的不知道正确的术语,但是这里有一个例子:

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>之间存在关系,但BaseDerived是完全不同的类型。

如果要允许传递任何PointerWrapper<>,请执行以下操作:

template<typename T>
void test(PointerWrapper<T>)
{ }

如果只允许PointerWrapper<T>源自TBase实例,请执行以下操作:
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

10-06 05:29