【问题标题】:Why derived class cannot be used in place of base class, as a template parameter?为什么派生类不能代替基类作为模板参数?
【发布时间】:2018-08-07 01:52:39
【问题描述】:

在下面的 sn-p 中,我有一个模板函数 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() {}

我不明白为什么会发生这种情况,为什么禁止这样使用?

【问题讨论】:

  • 这个答案here 可能会提供一些见解:“对于指向对象类型的非类型模板参数、限定转换 (4.4) 和数组到指针转换 ( 4.2) 应用”。关于基类转换什么也没说...

标签: c++ c++11 templates


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多