我的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>&)'
我的问题是,为什么?为什么地图试图构造时区对象?如果我总是将完全成形的物体放入我的地图中,为什么还需要呢?特别是,当我初始化地图时为什么会出现这个错误?
我std::unordered_map
想要添加一个键值对.如果密钥尚不存在,那么我希望它与给定值一起添加.如果密钥已存在,那么我希望更新该值.
这里的标准建议似乎是使用operator[]
.但是这需要地图的值类型是默认可构造的.我希望避免提供默认构造函数.我该怎么办?
我试图将方法插入到地图中,将一对插入到地图中工作正常,代码如下所示:
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()的匹配函数,候选者是:"它给出了我自己定义的构造函数.
我的猜测是,当使用索引方式转换为地图时,如果我要传入一个对象,那么它将自动调用其默认构造函数而不带参数.但由于我已经有一个带参数的自定义构造函数,因此会产生错误.因此,我尝试创建一个映射,其中值是一个对象,该对象只有默认构造函数.这样,编译器就不会抱怨.
我的问题是我找不到任何确认我的想法的文件.如果它是正确的,为什么具有对象值的映射调用默认构造函数而不是现有构造函数?
为什么单个参数构造函数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序列容器的接口稍微更一致.