c++ - 这段代码中对 std::map::operator[] 的调用在哪里?

标签 c++ visual-studio-2008 map

我的代码中有以下 typedef:

typedef unsigned long int ulint;
typedef std::map<ulint, particle> mapType;
typedef std::vector< std::vector<mapType> > mapGridType;

particle是没有默认构造函数的自定义类。

VS2008 在这段代码中给我一个错误:

std::set<ulint> gridOM::ids(int filter)
{
    std::set<ulint> result;
    ulint curId;
    for ( int i = 0; i < _dimx; ++i ) {
        for ( int j = 0; j < _dimy; ++j ) {
            // next line is reported to be erroneous
            for ( mapType::iterator cur = objectMap[i][j].begin(); cur != objectMap[i][j].end(); ++cur )
            {
                curId = (*cur).first;
                if ( (isStatic(curId) && filter != 2) || (!isStatic(curId) && filter != 1) )
                {
                    result.insert(curId);
                }
            }
        }
    }
    return result;
}

objectMapmapGridType 的对象.错误如下:

error C2512: 'gridOM::particle::particle' : no appropriate default constructor available
while compiling class template member function 'gridOM::particle &std::map<_Kty,_Ty>::operator [](const unsigned long &)'  
        with  
        [  
            _Kty=ulint,  
            _Ty=gridOM::particle  
        ]  
        .\gridOM.cpp(114) : see reference to class template   instantiation 'std::map<_Kty,_Ty>'   being compiled  
        with  
        [  
            _Kty=ulint,  
            _Ty=gridOM::particle  
        ]  

如果我错了请纠正我,但上面的代码不应该调用 map::operator[]根本。第一个operator[]调用电话 vector< vector<mapType> >并返回 vector<mapType> , 第二个是 vector<mapType>并返回 mapType又名 map<ulint, particle> , 我只调用 begin()end在那张 map 上。那么,为什么我在尝试编译 operator[] 时会出错?对于 map

最佳答案

我不确定我的答案。但是当你实例化一个模板时,编译器会实现模板中定义的所有函数(即使它们没有被使用)。因此,即使没有使用该功能,您也会收到错误消息。

能给出完整的错误信息吗?

编辑 有了完整的错误信息,您就明白了!如您所说,您的对象没有默认构造函数。但是,为了使用映射,您需要默认构造函数(因为函数 operator[] 需要它才能在使用新键时构建实例),即使您不使用该函数,它也会由编译器实现。

关于c++ - 这段代码中对 std::map::operator[] 的调用在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2341987/

相关文章:

c# - 如何声明一个 friend 集会?

visual-studio - Visual Studio 2008 智能感知优先级设置

java - 我如何让 Java 为我的类型安全映射文字推断出正确的通用映射类型?

hadoop - 如何将数据附加到存储在HDFS中的文件

c++ - 浮点运算的编程风格

python - 使用 Boost/python.hpp 的 CMake 编译 c++ 程序

visual-studio - 对 Visual Studio C++ 项目使用/Zi vs/Z7 有什么影响?

c++ - 在 C++ 中附加到缓冲区

c++ - 非成员转换函数;类型转换不同的类型,例如DirectX vector 到 OpenGL vector

c++ - 带有指向非常量的指针和指向相同地址的常量参数的指针的函数调用