C++/名称冲突:如何排除以前定义的函数



我想为自己定义的新数据类型Array编写log2()函数。所以它看起来像这个

#include <iostream>
#include <cmath>
Array log2(Array& A)
{
    Array C=A;
    for (int i=0; i<A.size(); i++)
         C[i]=log2(A[i]);
    return C;
}

尽管有sin、cos等其他函数,但这个函数(log2)并没有在std命名空间下声明。所以即使使用以下

std::log2(A[i])

编译器未解析内部log2是否支持为内置c函数。为了简化代码,我坚持使用相同的名称(log2)。

这是错误消息

错误:"Array&"类型的引用的初始化无效来自"double"类型的表达式

解决:当我切换到-std::C++11时,它起作用了。

std::log2是在C++11中引入的。确保您有一个兼容C++11的编译器(例如,gcc4.8或更高版本,使用-std=c++11编译),并在函数中使用std::log2

如果您不使用std::log2,那么编译器将找不到标准函数(因为您不是using namespace std;),并尝试使用您的函数,当然这不是为double s定义的,并且会出现错误。

我个人的观点是,你应该尽量避免将你的函数命名为标准函数,因为以后可能会出现头痛。

据我所知,内置函数log2没有在namespace std中声明。您应该使用以下代码来调用标准的log2函数:

log2(A[i]);

我希望我的回答能有所帮助。

相关内容

  • 没有找到相关文章

最新更新