【发布时间】:2017-09-26 20:09:07
【问题描述】:
C++ 允许在一个命名空间中使用同名的类和函数:
struct S {};
void S() {}
在这种情况下,纯名称S 表示函数S。要改用 struct,您需要在名称前显式添加 struct。
也可以制作函数模板,同时使用它们:
template <class T>
void S() {}
struct S {};
但是禁止使用模板结构
void S() {}
template <class T>
struct S {};
和gives error 像这样:
error: redefinition of 'S' as different kind of symbol
这是什么原因?为什么不允许在这里使用模板结构?是否存在在S 之前使用显式关键字struct (如非模板版本)如果允许的话无法解决名称冲突的情况?也许有提案存在?
【问题讨论】:
-
有没有一个类型和一个函数同名不会混淆的情况?有什么好处?
-
猜猜:出于兼容性原因从 C 继承的一个坏主意?这可以很好地解释事情,但我不知道这是不是真的。
-
@tobi303 一个已知的例子是
stat函数。你只需要记住一个名字:) -
那不是c函数吗?我不知道 C,但我不知道在 c++ 中有什么理由拥有同名的函数和类型
-
@tobi303 当然。但 c++ 大多与 c 代码兼容。我也认为没有理由禁止这样做。
标签: c++ templates overloading