【发布时间】:2014-11-19 15:02:34
【问题描述】:
如果我有一些类似的代码:
using namespace std;
namespace myNamespace
{
vector<float> sqrt( vector<float> v ) { return v; }
void func()
{
vector<float> myVec = { 1, 2, 3, 4 };
std::cout << sqrt( myVec )[0] << std::endl;
float myFloat = 4.0f;
std::cout << sqrt( myFloat ) << std::endl; // need to use std::sqrt()
}
}
除非我将标记行更改为使用std::sqrt,否则它将无法编译。为什么?我知道如果我尝试在myNamespace 中重新定义sqrt(float),那么如果我想使用标准库版本,我就必须符合std:: 的条件。编译器似乎试图转换 myFloat,而不是仅仅使用另一个 (std) 命名空间中的函数。
我发现解决此问题的一种方法是在std 命名空间中定义sqrt(vector<float>),但这感觉不太对,对this question 的回答建议std 中的重载是非法的。那时可能不是要走的路……
如何重载sqrt(或任何其他标准库 cmath 函数),这样我就不必总是限定使用哪一个并让编译器根据传递的函数参数进行选择?
谢谢。
【问题讨论】:
-
在
std命名空间中声明自己的函数肯定是错误的。您可以在全局命名空间中声明它,因为由于某种原因您已将std转储到其中。或者,您可以将using std::sqrt;添加到您的命名空间,以及您的sqrt。我只是正确地限定了这个名字。 -
你也可以不使用 use
using namespace somethingsomething而总是使用 std:: 前缀,完全避免这样的废话。
标签: c++ c++11 name-lookup