【发布时间】:2019-06-21 12:57:41
【问题描述】:
以下代码使用clang++ 8.0.0 和g++ 9.1.0 都可以正常编译(编译标志为-Wall -Wextra -Werror -pedantic-errors):
template <typename>
struct Base
{
};
struct Derived : Base<int>
{
Base base()
{
return Base();
}
};
int main()
{
}
这是这些编译器中的错误还是 C++ 标准的一个特性?
【问题讨论】:
-
要认识到的重要一点是 Base
是一个类,而不是模板类。编译器使用模板构建一个类,其中类型名 T 被模板化参数替换。所以,Base 是一个模板,而 Base 是模板生成的一个类。这意味着您可以在通常使用类的任何地方使用 Base 。这包括变量声明,或者如您所见,继承。 -
@Chipster 我认为您错过了问题中的“...没有模板参数”。
-
您发布的代码使用了它们,所以是的。我一定是误会了。您是在问为什么您发布的代码可以编译,或者为什么另一个 sn-p 可以或无法编译?
-
@Chipster 不,我发布的代码没有使用它们。查看方法
Derived::base()的定义。 -
啊。我明白你了现在。不知何故,我错过了那部分。我认为这是一个关于继承的问题。我猜错了。
标签: c++ templates inheritance language-lawyer c++17