αλε*_*λυτ 13 c++ templates overloading
C++允许在一个名称空间中使用具有相同名称的类和函数:
struct S {};
void S() {}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,纯名称S意味着功能S.要使用struct,您需要struct在name之前显式添加.
它也可以制作功能模板并仍然使用它们:
template <class T>
void S() {}
struct S {};
Run Code Online (Sandbox Code Playgroud)
但禁止使用模板结构
void S() {}
template <class T>
struct S {};
Run Code Online (Sandbox Code Playgroud)
并给出如下错误:
Run Code Online (Sandbox Code Playgroud)error: redefinition of 'S' as different kind of symbol
这是什么原因?为什么不允许在这里使用模板结构?是否有一个地方使用明确的关键字任何情况struct之前S(如非模板版本)没能解决命名冲突,如果它被允许?也许存在提案?
n. *_* m. 16
C++允许在一个名称空间中使用具有相同名称的类和函数.
Run Code Online (Sandbox Code Playgroud)struct S {}; void S() {}
通常在声明时struct S,您可以通过两种方式引用类型:as S和as struct S.但这只是在你声明其他命名的东西之前S,例如,一个函数.当您这样做时,该类型的名称不再是S.这是struct S唯一的.该名称S是为该功能保留的.
这样做是为了与C兼容.C代码经常使用此设备.与C++不同,C将struct和union标记放在与普通标识符不同的名称空间中,并且struct S不能简单地称为S.
因此,为了能够编译使用此设备的C代码,C++会对作为不同类型的标识符重用的struct标记进行例外处理.
由于class是近代名词struct,这是为做class关键字了.
但是C没有模板,也没有必要为它们提供向后兼容性,因此没有类模板的例外.