相关疑难解决方法(0)

没有合适的默认构造函数

我的C++程序中出现以下错误:

1>          c:\users\thom\documents\cworkspace\barnaby\barnaby\timezone.cpp(14) : see reference to class template instantiation 'std::map<_Kty,_Ty>' being compiled
Run Code Online (Sandbox Code Playgroud)

这在错误堆栈中有点下降,但指向这行代码:

static std::map<const std::string, Timezone>    timezoneMap;
Run Code Online (Sandbox Code Playgroud)

原因是Timezone有一个相当复杂的构造函数,但没有默认的构造函数.这是错误的一部分:

c:\program files\microsoft visual studio 10.0\vc\include\map(215): error C2512: 'Timezone::Timezone' : no appropriate default constructor available
Run Code Online (Sandbox Code Playgroud)

1> c:\ program files\microsoft visual studio 10.0\vc\include\map(210):同时编译类模板成员函数'Timezone&std :: map <_Kty,_Ty> :: operator [](const std :: basic_string <_Elem,_Traits,_Ax>&)'

我的问题是,为什么?为什么地图试图构造时区对象?如果我总是将完全成形的物体放入我的地图中,为什么还需要呢?特别是,当我初始化地图时为什么会出现这个错误?

c++ stl visual-c++

12
推荐指数
1
解决办法
9687
查看次数

插入或更新到unordered_map而不需要默认构造函数

std::unordered_map想要添加一个键值对.如果密钥尚不存在,那么我希望它与给定值一起添加.如果密钥已存在,那么我希望更新该值.

这里的标准建议似乎是使用operator[].但是这需要地图的值类型是默认可构造的.我希望避免提供默认构造函数.我该怎么办?

c++ stl unordered-map default-constructor visual-c++

7
推荐指数
1
解决办法
242
查看次数

C++将带有构造函数的对象插入到map中

我试图将方法插入到地图中,将一对插入到地图中工作正常,代码如下所示:

type insert(){
    map<int,MyClass> myMap;
    MyClass myObj(parameter);
    myMap.insert(pair<int,MyClass>(0,myObj));
    ...
    return myMap;
}
Run Code Online (Sandbox Code Playgroud)

但是,我决定使用另一种方式,基本上:

    map[key] = value;
Run Code Online (Sandbox Code Playgroud)

而且,它看起来像这样:

type insert(){
    map<int,MyClass> myMap;
    MyClass myObj(parameter);
    myMap[i] = myObj;
    ....
    return myMap;
 }
Run Code Online (Sandbox Code Playgroud)

编译器会给出一个错误说:"没有用于调用myObj :: myObj()的匹配函数,候选者是:"它给出了我自己定义的构造函数.

我的猜测是,当使用索引方式转换为地图时,如果我要传入一个对象,那么它将自动调用其默认构造函数而不带参数.但由于我已经有一个带参数的自定义构造函数,因此会产生错误.因此,我尝试创建一个映射,其中值是一个对象,该对象只有默认构造函数.这样,编译器就不会抱怨.

我的问题是我找不到任何确认我的想法的文件.如果它是正确的,为什么具有对象值的映射调用默认构造函数而不是现有构造函数?

c++ constructor map

6
推荐指数
2
解决办法
9082
查看次数

C++标准列表和默认构造类型

为什么单个参数构造函数std::list<T>需要T是一个默认可构造类型?我的意思是以下代码无法编译.

struct Foo { // does not have default constructor.
  Foo (int i) {} 
}
int main(void) {
  std::list<Foo> l(10);
}
Run Code Online (Sandbox Code Playgroud)

似乎可以使用构造并销毁习惯用法,因为它们已经在std :: vector中完成了,尽管有更多的书籍保持列表类.

在相关的说明中,为什么没有列表中的容量功能?您可以争辩说,这样的函数会预先支付内存分配成本,并在您push_back反对时消除开销.至少它会使两个STL序列容器的接口稍微更一致.

c++ stl list default-constructor

0
推荐指数
2
解决办法
3136
查看次数