gpt4 book ai didi

c++ - 为什么派生类不能代替基类作为模板参数?

转载 作者:行者123 更新时间:2023-11-30 00:43:55 26 4
gpt4 key购买 nike

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

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

P p;
Q q;

template <P*> void foo() {}

void test() {
foo<&p>();
foo<&q>();
}

根据文档,这应该可以工作,前提是

For pointers to objects, the template arguments have to designate the address of a complete object with static storage duration and a linkage (either internal or external), or a constant expression that evaluates to the appropriate null pointer or std::nullptr_t value.

由于所讨论的对象必须具有静态存储持续时间,因此我将其定义为全局。然而,编译器提示 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() {}

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

最佳答案

the template arguments have to designate the address of a complete object with static storage duration

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

关于c++ - 为什么派生类不能代替基类作为模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51717745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com