另请参阅
这不是一个大问题,只是很烦人,因为我不希望我的类在没有特定参数的情况下被实例化。
#include <map>
struct MyClass
{
MyClass(int t);
};
int main() {
std::map<int, MyClass> myMap;
myMap[14] = MyClass(42);
}
这给出了以下g++错误:
/usr/include/c++/4.3/bits/stl_map.h:419:错误:没有匹配的函数调用‘MyClass()’
如果我添加了一个默认的构造函数,它就可以很好地编译;我确信这不是由不正确的语法引起的。
发布于 2009-03-29 16:01:41
此问题随operator[]一起出现。引用自SGI文档:
data_type& operator[](const key_type& k)
-返回与特定键关联的对象的引用。如果贴图尚未包含此类对象,operator[]
将插入默认对象data_type()
。
如果你没有默认的构造函数,你可以使用插入/查找函数。下面的示例运行良好:
myMap.insert( std::map< int, MyClass >::value_type ( 1, MyClass(1) ) );
myMap.find( 1 )->second;
发布于 2009-03-30 00:53:47
检查stl::map存储类型的要求。许多stl集合要求存储类型包含一些特定属性(默认构造函数、复制构造函数等)。
不带参数的构造函数是stl::map所需要的,因为在使用键调用operator[]时会使用它,而键还没有被映射保留。在本例中,operator[]插入由使用无参数构造函数构造的新键和值组成的新条目。然后返回这个新值。
发布于 2021-12-22 11:15:33
假设您拥有以下内容
class Person
{
public:
Person(int age) :age(age){}
Person() {} // default ctor
int age;
};
map<int, Person> m;
// accessing not-existent key, results in assigning default value to that key
m[10];
// creates default object for key:20 first then assigns age
m[20].age = 32;
如果你想为一个不存在的键分配age
,该怎么办呢?
对于具有null
类型的语言,例如javascript
,映射将返回null
,并由用户在访问对象或其内部字段之前对其进行检查。
c++采用了一种不同的方法,它使用默认构造函数创建Person
,这样就可以完全避免null
https://stackoverflow.com/questions/695645
复制相似问题