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

C++/ name conflict: how to exclude a previously defined function

我想为我自己定义的数组的新数据类型编写 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)。

这是错误信息

错误:从类型 'double'

的表达式对类型 'Array&' 的引用的初始化无效

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

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

如果您不使用 std::log2,则编译器无法找到标准函数(因为您不是 using namespace std;)并尝试使用您的标准函数,这当然没有为 doubles,你得到一个错误。

我个人的意见是,您应该尽量避免将您的函数命名为与标准函数相同的名称,因为以后可能会出现令人头疼的问题。

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

log2(A[i]);

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