c++ - 显式特化导致实例化?

标签 c++ templates template-specialization

接听this question ,我从 GCC 和 Clang 那里得到了一个令人惊讶的错误:

template< typename = void >
struct Outer_temp
{
struct Inner;
Inner myinner;
};

template<>
struct Outer_temp<void>::Inner // Error: specialization of Outer_temp
{                              // with member myinner of incomplete type.
};

为什么声明显式特化需要隐式实例化?这是否与范围解析运算符的所有用途属于同一类别?

实例化模板以查找成员对象的声明我会理解,但在成员类的情况下,您可以检查成员是否存在并且是一个类,而无需实例化任何东西。 (不过,您确实需要部分特化解决方案。)

最佳答案

仔细想想,这是语言设计固有的缺陷,也是显式特化的怪癖。如果不实例化类模板及其所有成员声明,​​就无法将显式特化声明与成员声明相匹配。

我不会提交缺陷报告,因为用例太小而无需担心,也不会因为当前的实现诊断条件而不知不觉地咬人。

关于c++ - 显式特化导致实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20110225/

相关文章:

c++ - 是否有可能摆脱模板特化以停止递归?

c++ - 卡在 if 语句中,以检查列表中的数字

c++ - 了解 TM 模拟器

c++ - boost 软件集成

c++ - g++ 和 clang++ 在 `std::make_index_sequence` 和 `std::index_sequence` 用于模板参数默认类型时的不同行为

c++ - 完全专用模板中构造函数的外线定义

C++ 确保浮点大小为 4 个字节

c++ - gcc编译失败,但msc++编译成功

c++ - 在嵌套需求中,为什么使用 `requires bool_constant<X>::value;` 而不是 `requires X;` ?

c++ - 类型特征以检查参数包中的所有类型是否都是可复制构造的