在创建和不创建模板的情况下递增迭代器

Bra*_*son 0 c++ containers iterator stl increment

我正在编写一行非常简单的代码来显示地图容器的内容,但遇到了一个有趣的错误。如果我写:

    void DisplayMap(const map<int, string>&  myMap)
{
    for (const map<int, string>::const_iterator myIterator = myMap.begin(); 
         myIterator != myMap.end(); ++myIterator)
    {
        cout << myIterator->first << ": " << myIterator->second << endl;
    }   
}
Run Code Online (Sandbox Code Playgroud)

编译器反对我使用++myIterator,声称该函数没有“++”类型的重载运算符。但是,如果我将其设为模板:

template <typename T>
void DisplayMap(const T&  myMap)
{
    for (map<int, string>::const_iterator myIterator = myMap.begin(); myIterator != myMap.end(); ++myIterator)
    {
        cout << myIterator->first << ": " << myIterator->second << endl;    
    }
}
Run Code Online (Sandbox Code Playgroud)

那么就没有问题了。代码运行完美。我希望有人能解释为什么编译器在这里没有问题。据我了解,使函数成为模板类似于为变量类型调用 auto 。但是编译器到底在做什么呢?

谢谢你的时间。

for*_*818 5

大多数迭代器和模板的东西在这里并不相关。相关的是const

    for (const map<int, string>::const_iterator myIterator = myMap.begin(); 
               myIterator != myMap.end(); ++myIterator)
          ^^ !!!
Run Code Online (Sandbox Code Playgroud)

你不能增加 aconst iterator因为它是const。你会得到类似的错误

for (const int i= 0; i< N; ++i) {
Run Code Online (Sandbox Code Playgroud)

在这里,i不能递增,因为它是const

在您的模板版本中,您删除了const,这就是没有错误的原因。