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

时间:2018-08-07 01:52:39

标签: 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>();
}

根据文档,如果

可以正常工作
  

对于指向对象的指针,模板参数必须指定具有静态存储持续时间和链接(内部或外部)或计算为适当的空指针或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() {}

我不明白为什么会这样,为什么禁止这种用法?

1 个答案:

答案 0 :(得分:6)

  

模板参数必须指定具有静态存储期限的完整对象的地址

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