c++ - 为什么有时使用基本类型作为基类编译?
问题描述
编译(使用 GCC 9 和 Clang 9 测试):
template<typename U>
struct inherit : U { };
int test(inherit<int> arg);
但这不会:
int test(inherit<int> arg) { }
为什么第一个编译?
解决方案
int test(inherit<int> arg);
只是一个声明。因此,我们还不需要知道inherit<int>
。因此,编译器会放手。
你现在有了int test(inherit<int> arg) { }
一个定义,现在我们需要知道当函数退出inherit<int>
时arg
它可以被销毁。此时模板被实例化,你会得到一个错误,因为它是无效的。
忽略该声明的另一个原因是,inherit
它稍后可能会被专门化,int
并且该专门化实际上可能是一个有效的类,因为您可能有类似的东西
template<>
struct inherit<int> { };
如果您要在两者之间添加它int test(inherit<int> arg);
,int test(inherit<int> arg) { }
那么代码现在可以编译,因为inherit<int>
现在是一个有效类型。
推荐阅读
- python - 用 NaN 填充缺失的日期时间或抑制折线图中的直线
- c# - ChromeDriver 无法在 Windows 7 中运行 Chrome。为什么?
- c# - 命名元组定义中的自定义名称成为默认名称“Item1”和“Item2”
- python - 重新连接后 Mqtt 不向订阅者发送数据
- r - 如何根据单独变量的 bin 识别一个变量的最大值
- testng - fail(String message) 方法在测试中被调用两次时的行为如何
- python - 无法使用 boto3 分页遍历 cloudwatch 上的所有警报
- c++ - 如何在关闭 Qt 控制台应用程序之前运行我的析构函数?
- spf - 什么被认为是 DMARC 失败?
- angular - 尝试为过去的项目安装 Angular 2