【发布时间】:2015-07-14 01:04:25
【问题描述】:
这是一个关于想法而不是真实代码的问题
过去我总是写很多方法重载,这很好:
class myclass
{
public:
std::string method(type1 a)
{
return method(...);
}
std::string method(type2 a)
{
return ....;
}
}
这太棒了。
问题从昨天写的函数重载是命名空间开始:
namespac myspace
{
std::string func(type1 a)
{
return func(...);
}
std::string func(type2 a)
{
return ....;
}
}
这里的问题是,在命名空间内部,编译器不知道第二个函数。因此,它尝试将给定类型转换为与第一个函数匹配的内容。不幸的是,编译器没有告诉我这是我的错误。虽然我向函数发送了type2,但它试图将其转换为type1 以调用自身,结果是stackoverflow。
尽管改变函数的顺序可以解决问题,但我想知道在专业 C++ 编程中在命名空间中使用函数重载是不是一个坏主意?
【问题讨论】:
-
问题不在于函数重载,而在于确保调用时要调用的定义在范围内。
-
如果这是在命名空间之外,你会得到同样的错误。类是特殊的(出于某种原因)。
-
很遗憾,意识形态问题。您会发现很多编码标准会建议“永远不要超载。EVER”,尤其是在清晰度和可预测性是基本要求的安全关键型应用程序中。没有人希望火箭在一百英尺高的地方引爆,因为
bool恰好更适合。 -
至于具体问题,(1)关于真正的问题:在专业编程中,您通常希望在头文件中声明您的函数,并在其他地方定义它们(通常在 .cpp文件,但偶尔在同一个头文件中),除非您不想公开该函数。最终结果是您无需担心定义函数的顺序。 (2) 我有一份工作不鼓励重载,并建议让参数类型显而易见,getUserIdByUsername()、getUserIdForAdmin() 等。我不喜欢它。
标签: c++ class namespaces