【发布时间】:2015-07-09 21:42:21
【问题描述】:
class P
{
};
template< typename P >
class C : public P
{
public:
void f()
{
P::f();
}
};
int main() {
C<P> c1;
return 0;
}
以防我的问题留下任何误解的余地,这里有一个代码示例。如果C 不是 模板化但直接从P 继承,则示例将无法编译,因为显然函数f() 试图调用基类P 上的函数,这是非存在。
但是,如果 C 被模板化,那么只有在实际调用 f() 时才会使用它。
我想知道为什么会有这种差异。在这两种情况下,f() 都将是死代码并被剥离,但在非模板场景中程序格式不正确。
【问题讨论】:
-
请注意,您可以通过显式实例化
C<P>来触发错误。 -
它从来没有被编译过,所以它没有被“允许”,它根本不存在于文本形式之外。