【问题标题】:templated printMap not compiling模板化 printMap 未编译
【发布时间】:2014-11-11 16:23:11
【问题描述】:

试图实现一个 printMap 类,这显然是为了打印我正在使用的地图的内容,它没有编译抱怨 std::map::iterator 中的输入类型。我如何摆脱这个问题并编译它?

template <class tagType, class valueType>
void printMap (const std::map<tagType, valueType>& myMap)
{
    if (myMap.size()== 0)
        return;
    if (DEBUG_PRINT) {
    std::map<tagType, valueType>::const_iterator it = myMap.begin();
    std::map<tagType, valueType>::const_iterator itEnd = myMap.end();
    std::cout << "================================================================================" << std::endl;
    for (; it != itEnd; it++)
        std::cout << (*it).first << ":" << (*it).second << std::endl;
    std::cout << "================================================================================" << std::endl;
    }
    return;
}

错误:在“std::map::const_iterator”之前需要“typename”,因为“std::map”是 依赖范围 std::map::const_iterator it = myMap.begin(); ^

【问题讨论】:

    标签: c++ stdmap


    【解决方案1】:

    所以,您也可以使用以下循环
    for(__typeof(myMap.begin()) it = (myMap.begin()); it!= myMap.end(); it++)
    *声明的新变量(指针)it等于大小myMap.begin(),循环将增加到直到it不同于myMap.end()

    【讨论】:

      【解决方案2】:

      您似乎在“std::map::const_iterator”之前需要“typename”,因为“std::map”是一个依赖范围。

      这意味着const_iterator 在模板被实例化之前是未知的,所以你需要提到它实际上是一个类型(否则它被认为是一个变量)。

      在你的例子中:

      typename std::map<tagType, valueType>::const_iterator it = myMap.begin();
      

      【讨论】:

      • 你是不是用不同的格式给我重新写了错误信息?我知道。如何(并且有可能)解决它?
      • @navderm 是的,我做到了。因为它准确地告诉你要做什么:当你使用模板类中的类型时,你需要在它前面加上typename
      • 我想了解您的评论的意思。您的意思是 typename 需要与我定义 ::const_iterator 的行一起使用吗?如果是这样,我该怎么做?
      • @navderm 你去 :)
      • 啊!我知道 !对不起,我的错!
      猜你喜欢
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 2013-11-16
      • 1970-01-01
      • 2011-07-21
      • 2017-06-19
      相关资源
      最近更新 更多