C++ C++;/名称冲突:如何排除以前定义的函数
我想为我自己定义的新数据类型编写log2()函数。所以看起来是这样的C++ C++;/名称冲突:如何排除以前定义的函数,c++,c++11,name-conflict,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; } 编译器没有解析内部log2是否被支持为内置c函数。为了代码的简单性,我坚持使用相
#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;
}
编译器没有解析内部log2是否被支持为内置c函数。为了代码的简单性,我坚持使用相同的名称(log2)
这是错误消息
错误:从“double”类型的表达式初始化“Array&”类型的引用无效
解决:当我切换到-std::C++11时,它起作用。是在C++11中引入的。确保您有符合C++11的编译器(例如,gcc4.8或更高版本,使用-std=C++11
编译),并在函数中使用std::log2
如果不使用std::log2
,编译器将找不到标准函数(因为您没有使用命名空间std;
),并尝试使用您的函数,当然这不是为double
定义的,您会得到一个错误
我个人的意见是,您应该尽量避免将函数命名为与标准函数相同的函数,因为以后可能会出现令人头痛的问题。是在C++11中引入的。确保您有符合C++11的编译器(例如,gcc4.8或更高版本,使用-std=C++11
编译),并在函数中使用std::log2
如果不使用std::log2
,编译器将找不到标准函数(因为您没有使用命名空间std;
),并尝试使用您的函数,当然这不是为double
定义的,您会得到一个错误
我个人的意见是,您应该尽量避免将函数命名为与标准函数相同的函数,因为以后可能会出现令人头痛的问题。据我所知,内置函数
log2
未在命名空间std
中声明。
应使用以下代码调用标准的log2
函数:
log2(A[i]);
我希望我的回答有帮助。据我所知,内置函数
log2
没有在命名空间std
中声明。
应使用以下代码调用标准的log2
函数:
log2(A[i]);
我希望我的回答能有所帮助。我不明白问题标题和实际问题是如何结合在一起的。这个问题听起来像是编译器/链接器出错了。请发布该错误消息。以下是错误:>错误:从类型为“double”的表达式初始化类型为“TArray&”的引用无效。如果包含
,则该引用应位于标准命名空间中。它适用于除log2I之外的其他内置函数。我不明白问题标题和实际问题是如何组合在一起的。这个问题听起来像是编译器/链接器出错了。请发布该错误消息。以下是错误:>错误:从类型为“double”的表达式初始化类型为“TArray&”的引用无效。如果包含
,则该引用应位于标准命名空间中。它适用于其他内置项,除了log2打开终端并键入g++--version
以查看版本。在编译代码时,还要确保使用-std=c++11
。但是可能有一个bug(我很久以前就报告过了),看看,不确定mingw是否受到了影响。@AliQajar很高兴它起到了作用!打开一个终端,键入g++--version
查看版本。在编译代码时,还要确保使用-std=c++11
。但是可能有一个bug(我很久以前就报告过了),看看,不确定mingw是否受到了影响。@AliQajar很高兴它起到了作用!在C++11中,它是在std::下声明的,就像中的其他内置数学函数一样。我添加了C++11开关,它工作了。它可以被称为std::log2(),这正是问题中的代码所做的,但它不起作用。在C++11中,它是在std::下声明的,就像中的其他内置数学函数一样。我添加了C++11开关,它工作了。它可以被称为std::log2(),这正是问题中的代码所做的,但它不起作用。