首页 > 解决方案 > 为什么有时使用基本类型作为基类编译?

问题描述

编译(使用 GCC 9 和 Clang 9 测试):

template<typename U>
struct inherit : U { };

int test(inherit<int> arg);

但这不会:

int test(inherit<int> arg) { }

为什么第一个编译?

标签: c++templatessfinae

解决方案


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>现在是一个有效类型。


推荐阅读