输入&#39; std :: map <std :: basic_string <char>,int&gt;&#39;不完整

时间:2015-12-08 08:04:46

标签: c++ visual-studio visual-c++ visual-studio-2013

我尝试将std::map与任何类型参数的变体一起使用时,我给出了红色语法突出显示应指示编译器错误,但我仍然能够编译和运行没有问题。我重新启动了visual studio,清理了我的项目,并重建了项目,但问题仍然存在。我也尝试删除.sdf,因为我认为它可能会在它的历史中保存一些奇怪的东西,至少从我研究过它可能是原因。我也在警告级别4;我试图降低它,但没有果汁。

Syntax Highlighting Error

编辑1: 它实际上只是一个成员函数的一部分,如果它在一个自由函数中,我没有得到任何语法高亮。

编辑2:

  • 的main.cpp

    #include "MCVE.h"
    
    int main()
    {
        return 0;
    }
    
  • MCVE.cpp

    #include "MCVE.h"
    #include <map>
    
    MCVE::MCVE()
    {
    }
    
    void MCVE::Test() const
    {
        // syntax highlighting error appears here
        std::map<std::string, int> myMap;
    }
    
    MCVE::~MCVE()
    {
    }
    
  • MCVE.h

    #pragma once
    
    class MCVE
    {
    public:
        MCVE();
        void Test() const;
        ~MCVE();
    };
    

编辑3:我已经接受了Pete Becker的回答,但问题似乎只存在于我的本地计算机上。我用Visual Studio标记了这个,因为我认为它有问题,因为它只在我的家用电脑上有突出显示问题,而不是我的工作电脑。

最终修改:问题是,我遇到问题的类的基本类型中包含的标题之一是使用header guards而不是{ {1}}就像我正在处理的文件一样。添加正确的pragma once语句并明确说明函数的命名空间并没有解决它。只有将#include更改为header guards才能解决问题。

1 个答案:

答案 0 :(得分:1)

新代码仍然缺失#include <string>。编译器没有抱怨名称std::string这一事实只意味着它已在某处被宣布;标头通常使用在其他地方定义的名称的前向声明来避免标头膨胀。这样做很好,并且符合标准,但您必须遵循#include指令的规则,以获得您使用的每种标准库类型的相应标头。