14/1 [temp]
提供:
模板声明中的声明应
(1.1) - 声明或定义函数,类或变量,或
(1.2) - 定义成员函数,成员类,成员 枚举,或类模板或类的静态数据成员 嵌套在类模板中,或
(1.3) - 定义类或类模板的成员模板,或
(1.4) - 是别名声明。
第二个子弹不清楚,因为它看起来像我们无法声明而没有定义类模板的成员。但实际上我们可以这样做:
template <class U>
struct A
{
template<class T>
void foo();
};
int main(){}
而clang和gcc编译得很好。 oyu可以解释这意味着什么吗?
答案 0 :(得分:3)
template <class U>
struct A
{
template<class T>
void foo();
};
如您所见,声明是void foo();
,它是一个有效的函数声明。因此,第一个要点适用:
模板声明中的声明应
- 声明或定义函数,类或变量,或
- 定义成员函数,成员类,成员枚举或类模板的静态数据成员或嵌套在其中的类的静态数据成员 类模板,或
第二个项目中提到了成员函数,仅用于强调
template<class T>
void A<T>::foo() {}
有效;此模板声明(void A<T>::foo() {}
)中的声明是成员函数定义。 “或”不是唯一的,因为上面的声明仍然是一个函数定义。
现在很清楚,这只能涉及定义,因为
template<class T>
void A<T>::foo();
无论如何都无效。