gpt4 book ai didi

c++ - 为什么模板类允许无法编译的成员函数?

转载 作者:IT老高 更新时间:2023-10-28 22:17:02 24 4
gpt4 key购买 nike

class P
{
};

template< typename P >
class C : public P
{
public:
void f()
{
P::f();
}
};

int main() {
C<P> c1;
return 0;
}

以防我的问题留下任何误解的余地,这里有一个代码示例。如果 Cnot 模板化但直接从 P 继承的,则示例将无法编译,因为显然函数 f() 尝试调用不存在的基类 P 上的函数。

但是,如果 C 是模板化的,那么只有在实际调用 f() 时才会使用它。

我想知道为什么会有这种差异。在这两种情况下,f() 都将是死代码并被剥离,但程序在非模板场景中格式错误。

最佳答案

实际上,您发布的程序并非格式错误。而“隐式实例化”C<P> c1;实例化所有成员声明

the specialization of the member is implicitly instantiated when the specialization is referenced in a context that requires the member definition to exist

[N4140, 14.7.1(2)] 因为你从不使用 C<P>::f ,它的定义永远不需要,因此永远不会被实例化。

这与“显式实例化”不同

template class C<P>;

这将实例化C<P> 的所有成员的定义从而导致错误。

关于c++ - 为什么模板类允许无法编译的成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31328754/

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