C++ 为什么不能使用派生类代替基类作为模板参数?

C++ 为什么不能使用派生类代替基类作为模板参数?,c++,c++11,templates,C++,C++11,Templates,在下面的代码段中,我有一个模板函数foo(),它将指向某个对象的指针作为模板参数 class P {}; class Q : public P {}; P p; Q q; template <P*> void foo() {} void test() { foo<&p>(); foo<&q>(); } 我不明白为什么会发生这种情况,为什么这种用法是被禁止的 模板参数必须指定具有静态存储持续时间的完整对象的地址 基类子对象不是完整

在下面的代码段中,我有一个模板函数
foo()
,它将指向某个对象的指针作为模板参数

class P {};
class Q : public P {};

P p;
Q q;

template <P*> void foo() {}

void test() {
  foo<&p>();
  foo<&q>();
}
我不明白为什么会发生这种情况,为什么这种用法是被禁止的

模板参数必须指定具有静态存储持续时间的完整对象的地址

基类子对象不是完整的对象

模板参数必须指定具有静态存储持续时间的完整对象的地址

基类子对象不是一个完整的对象。

这个答案可能会提供一些见解:“对于指针指向对象类型的非类型模板参数,将应用限定转换(4.4)和数组到指针转换(4.2)”。关于基类转换什么都没说……这个答案可能会提供一些见解:“对于指针指向对象类型的非类型模板参数,将应用限定转换(4.4)和数组到指针转换(4.2)”。没有关于基类转换的说明。。。
test.cc:66:7: error: no matching function for call to 'foo'
      foo<&q>();
      ^~~~~~~
test.cc:62:26: note: candidate template ignored: invalid
explicitly-specified argument for template parameter 'p'
    template <P* p> void foo() {}