我正在编写一个表示算术类型的 C++ 类(围绕mpfr的 c++ 包装器),并且我想支持 <cmath> 中的一些函数(我将以 std::sqrt 为例)。
所以我有以下课程:
namespace ns
{
class MyClass
{
/* ... */
public:
friend MyClass sqrt(const MyClass& mc);
};
}
我可以这样使用它:
MyClass c;
/* ... */
MyClass d = ns::sqrt(c);
MyClass e = sqrt(c); // Apparently I don't have to specify ns::
但我不能这样使用它:
MyClass f = std::sqrt(c);
编译器 (g++ (Debian 4.7.2-5)) 错误是:“没有匹配函数调用 sqrt(ns::MyClass&)”。
这很正常,但对我来说是个问题。我需要这是有效的,因为 MyClass 应该用于现有的模板函数(我不应该修改)。例如:
template <typename T>
void func(T a)
{
/* ... */
T c = std::sqrt(a);
/* ... */
}
int main()
{
func<float>(3);
func<MyClass>(MyClass(3));
/* ... */
}
以下代码实际上解决了我的问题:
namespace std
{
using ns::sqrt;
}
但是在 std 命名空间中添加东西对我来说似乎很不自然。我怕以后会遇到意想不到的麻烦,这样做。
安全吗?如果不是,为什么?
有更好的选择吗?