使用 Memset 函数时对数组的引用是模棱两可的错误

reference to array is ambiguous error when using memset function

提问人:metis 提问时间:5/9/2015 最后编辑:Vlad from Moscowmetis 更新时间:8/20/2023 访问量:13011

问:

我不明白为什么我会接受这个“奇怪”的错误。我读过类似的问题,但它没有回答我的问题。如果我在 main 函数而不是全局范围内定义数组,则没有错误。但是假设我必须在全局范围内定义这个数组。为什么我会出现这个错误? 代码如下:

#include <iostream>
#include <cstring>

using namespace std;

int right[1005];
int main()
{
    memset(right,0,sizeof(right));
return 0;
}

这是错误:

memset2.cpp: In function ‘int main()’:
memset2.cpp:9:9: error: reference to ‘right’ is ambiguous
  memset(right,0,sizeof(right));
     ^
memset2.cpp:6:5: note: candidates are: int right [1005]
 int right[1005];
     ^
In file included from /usr/include/c++/4.8/ios:42:0,
             from /usr/include/c++/4.8/ostream:38,
             from /usr/include/c++/4.8/iostream:39,
             from memset2.cpp:1:
/usr/include/c++/4.8/bits/ios_base.h:924:3: note:                 std::ios_base& std::right(std::ios_base&)
   right(ios_base& __base)
   ^
memset2.cpp:9:24: error: reference to ‘right’ is ambiguous
  memset(right,0,sizeof(right));
                    ^
memset2.cpp:6:5: note: candidates are: int right [1005]
 int right[1005];
     ^
In file included from /usr/include/c++/4.8/ios:42:0,
             from /usr/include/c++/4.8/ostream:38,
             from /usr/include/c++/4.8/iostream:39,
             from memset2.cpp:1:
/usr/include/c++/4.8/bits/ios_base.h:924:3: note:                 std::ios_base& std::right(std::ios_base&)
   right(ios_base& __base)
   ^
C++ 命名空间 name-lookup using-directives unqualified-name

评论

0赞 metis 5/9/2015
我习惯于在我的代码中编写所有使用命名空间。我现在真的很惊讶。你为什么建议我不要使用它?你能指导我吗?
2赞 youssef 5/9/2015
使用它没有问题,但您必须确保永远不要使用与 C++ 标准库同名的用户定义的函数、对象或变量。我认为是一种古老的风格。using namespace std
0赞 youssef 5/9/2015
例如;你可以说然后像这样使用 cout 标准对象#include <iostream>std::cout << "somthing"
0赞 metis 5/9/2015
我应该在哪些其他方面添加“std::”?由于我总是写“使用命名空间 std;”,所以我不知道
1赞 youssef 5/9/2015
还有一件事是有帮助的。对于头文件,使用是一种不好的做法using namespace std

答:

1赞 youssef 5/9/2015 #1

从代码中删除,并在任何标准函数或对象前面加上using namespace std ;std::

7赞 Vlad from Moscow 5/9/2015 #2

命名空间已命名,并且您通过指令在全局命名空间中包含名称形式stdrightstd

using namespace std;

因此,为了避免歧义,请使用限定名称

memset( ::right, 0, sizeof( ::right ) );

或者删除该指令,在这种情况下,您可以使用非限定名称,因为编译器将仅在全局命名空间中查找该名称。right

评论

0赞 David Rodríguez - dribeas 5/9/2015
删除指令:)
0赞 ABaumstumpf 8/20/2023
链接:std::right - 导致此处命名冲突的东西。
-1赞 DarryBassett 8/20/2023 #3

如果以下语句有不明确的错误

 memset ( (char*)&mybuf, 0, sizeof(mybuf) );

试一试,先在 memset 之前

std::memset ( (char*)&mybuf, 0, sizeof(mybuf) );