在主模板中定义类成员,并在特化期间进行隐式实例化
Definition of a class member in the primary template and an implicit instantiation during specialization
我从§14.7.3/6 [temp.expl.spec]
分解了下面的例子,它在主模板中定义了一个类成员枚举,然后对它进行了专门化。以下代码不能在clang中编译:
template<class T>
struct A {
enum E : T;
};
template<class T>
enum A<T>::E : T { eT };
template<>
enum A<char>::E : char { echar }; // ill-formed, A<char>::E was instantiated
// when A<char> was instantiated
// error: explicit specialization of 'E' after instantiation
原因应该是在特化之前实例化了无作用域成员枚举的定义。14.7.1 [temp.inst]/1:
类模板特化的隐式实例化会导致[…]的隐式实例化。的定义
我正在努力理解为什么这是一个问题。是因为如果枚举已经有定义,那么这会在专门化期间导致重定义错误吗?
您需要对整个类定义进行专门化:
template<class T>
struct A {
enum E : T { eT };
};
template<>
struct A<char> {
enum E : char { echar };
};
相关文章:
- 对显式实例化的模板函数的未定义引用
- 未定义的类模板不会实例化以检查友元函数
- 将自定义 QMap 模板实例化以人类可读的形式保存在 QSettings 中
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- 何时需要实例化函数模板定义?
- 使用用户定义的类型 UDT 实例化 std::atomic<>。如果 UDT 具有虚函数,则 l 墨水将失败。为什么?
- 实例化具有不完整类型的类模板格式不正确(如果该类型是在之后定义的)
- 将类成员函数的模板定义放在 CPP 文件中C++隐式实例化而不是 .H 允许吗?
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- XCode 警告"此处需要实例化变量'Singleton:<Foo>:_instance',但没有可用的定义
- 即使我正在.cpp文件中实例化一个伪对象,.cpp文件内模板函数的定义也不起作用
- 没有为显式模板实例化请求提供合适的定义
- 如何键入定义一个专门的 std::set 模板,使用特定的比较函数实例化
- unique_ptr 使用尚未定义的参数进行实例化不会导致错误
- 为什么找不到使用命名空间中定义的类型实例化的 std::weak_ptr 的重载运算符==?
- 如何严格定义函数模板显式实例化规则
- gcc 中的模板显式实例化(定义和声明)
- c++ 11:显式实例化声明vs显式实例化定义
- 当显式模板实例化定义在显式声明之前时,GCC和clang不同意
- 显式模板实例化定义是否也抑制隐式实例化