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() {}