iterator header:不能使用begin或end with array作为参数,c ++ 11

时间:2014-02-04 18:19:50

标签: arrays pointers iterator

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中尝试了这个。

1 个答案:

答案 0 :(得分:0)

beginendstd命名空间中的函数,因此您应该使用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等进行此操作),或明确限定它们。