C ++ / name冲突:如何排除先前定义的函数

时间:2016-01-05 22:51:32

标签: c++ c++11 name-conflict

我想为我自己定义的新数据类型编写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&amp;”类型引用的初始化无效来自'double'类型的表达式

已解决:当我切换到-std :: C ++ 11时,它有效。

2 个答案:

答案 0 :(得分:6)

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

如果你不使用std::log2,那么编译器找不到标准函数(因为你不是using namespace std;)并试图使用你的函数,当然这里没有定义{ {1}} s,你得到一个错误。

我个人的意见是,你应该尽量避免将你的功能命名为标准功能,因为以后会出现头痛。

答案 1 :(得分:-2)

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

log2(A[i]);

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