1> c:\ users \ indira \ documents \ visual studio 2012 \ projects \ cpppremier \ cpppremier \ ch1.cpp(2060):错误C3861:'begin':找不到标识符
1> c:\ users \ indira \ documents \ visual studio 2012 \ projects \ cpppremier \ cpppremier \ ch1.cpp(2060):错误C3861:'end':未找到标识符
==========构建:0成功,1失败,0最新,0跳过==========
#include <iostream>
#include <string>
#include <cstddef>
#include<array>
#include<vector>
#include <iterator>
using std::string;
using std::cin;
using std::cout;
using std::endl;
int main()
{
int ia[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int *pbeg = begin(ia), *pend = end(ia);
cout << "Elements in arr: " << endl;
for (int *pbeg; pbeg != pend; ++pbeg)
{
*pbeg = 0;
cout << *pbeg << endl;
}
getchar();
getchar();
return 0;
}
我不明白为什么这不起作用。我正在尝试使用迭代器头来使用该头中定义的开始和结束函数。 代码有迭代器头。函数将数组作为参数,因为数组不是类类型... 我在visual studio 2013和compileonline.com c ++ 11中尝试了这个。
答案 0 :(得分:0)
begin
和end
是std
命名空间中的函数,因此您应该使用using
引入它们,或者对它们进行限定(例如std::begin
)
当你的参数本身是std
类型时,你不需要这个:在这种情况下,依赖于参数的查找会找到它们 - 但是当你的参数是基本类型时,ADL不起作用,或者其他任何东西本身不起作用在namespace std
内定义。
下面是一些示例代码,用于解释在这种情况下名称查找的工作原理。仅仅因为某些内容在翻译单元中可见,并不意味着它是有效的匹配。
namespace test {
struct Type { };
void foo(Type);
void bar(int);
}
int main() {
/*
Type t; <-- NO: Type is declared but not visible for name lookup
nl.cpp: In function ‘int main()’:
nl.cpp:11:5: error: ‘Type’ was not declared in this scope
nl.cpp:11:5: note: suggested alternative:
nl.cpp:3:12: note: ‘test::Type’
*/
test::Type u; // OK: the qualified name can be looked up
foo(u); // OK: argument-dependent lookup means test is considered
/*
bar(1); <-- NO: int isn't part of namespace test
nl.cpp:22:10: error: ‘bar’ was not declared in this scope
nl.cpp:22:10: note: suggested alternative:
nl.cpp:6:10: note: ‘test::bar’
*/
test::bar(1); // OK: explicitly tell the compiler where to look
}
您可以使用using
将其他名称空间中的名称引入当前名称(您已使用std::string
等进行此操作),或明确限定它们。