为什么派生类不能用来代替基类,作为模板参数?

Pas*_*sha 1 c++ templates c++11

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

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

P p;
Q q;

template <P*> void foo() {}

void test() {
  foo<&p>();
  foo<&q>();
}
Run Code Online (Sandbox Code Playgroud)

根据文档,这应该工作提供

对于指向对象的指针,模板参数必须指定具有静态存储持续时间和链接(内部或外部)的完整对象的地址,或者计算为适当的空指针或std :: nullptr_t值的常量表达式.

由于有问题的对象必须具有静态存储持续时间,因此我将其全局定义.但是,编译器抱怨第二次调用foo():

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() {}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会这样,为什么禁止这样的使用?

T.C*_*.C. 6

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

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