在以下代码段中,我有一个模板函数foo()
,该函数将指向某个对象的指针作为模板参数。
class P {};
class Q : public P {};
P p;
Q q;
template <P*> void foo() {}
void test() {
foo<&p>();
foo<&q>();
}
根据文档,这应该可以工作,
由于所讨论的对象必须具有静态存储期限,因此我将对其进行全局定义。但是,编译器抱怨
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() {}
我不明白为什么会这样,为什么禁止这种用法?
最佳答案
基类的子对象不是完整的对象。