我正处于project为Arduino编写类似stl的容器中间。到目前为止,我已成功编写了deque,vector和string。
我遇到了map
容器的问题。出于某种原因,在map::insert()
方法中,编译器告诉我它期待一个类型说明符。我已经包含了与问题相关的所有代码。任何帮助,将不胜感激。
///////////////////////////////////////////////////////////////////////////////
// pair
///////////////////////////////////////////////////////////////////////////////
template<typename K, typename V>
class pair {
public:
pair( const K& key, const V& val )
: _key_( key )
, _val_( val )
{}
pair( const pair& p )
: _key_( p.key() )
, _val_( p.val() )
{}
virtual ~pair(){}
K& key(){
return _key_;
}
V& val(){
return _val_;
}
private:
K _key_;
V _val_;
};
///////////////////////////////////////////////////////////////////////////////
// map
///////////////////////////////////////////////////////////////////////////////
template<typename K, typename V>
class map {
public:
map()
: _size_( 0 )
, _items_( 0 )
{}
virtual ~map(){
for( int i = 0; i < _size_; ++i )
delete _items_[i];
free( _items_ );
}
void insert( const pair<K,V>& p ){
_items_ = reinterpret_cast<kick::pair<K,V>**>( realloc( _items_, (sizeof( void* ) * (++_size_)) ) );
_items_[_size_ - 1] = new pair( p ); //error: expected type-specifier
}
V& operator[]( const K& key ){
for( int i = 0; i < _size_; ++i ){
if( _items_[i].key() == key )
return _items_[i].val();
}
}
private:
int _size_;
pair<K,V>** _items_;
};
答案 0 :(得分:3)
pair
只是一个模板,而不是一个类型。编译器期望模板参数,在这种情况下是类型。这就是,期待你的行:
_items_[_size_ - 1] = new pair<K,V>( p );
不,它不能推断出模板参数;这仅适用于模板函数,而不适用于类型。
答案 1 :(得分:1)
new pair<K,V>( p )
就是它想要的。
对于我自己,我会在vector
之上实现一个平面地图,所以我不必在其中进行内存管理。这样做的一个优点是您可以删除一个间接级别。 (间接是性能杀手)。
另一个想法是有一个高水分类标记,排序标记之前的东西被分类,之后的东西是混乱的。当容器变大时,这可以减少对比。但首先让你的平面地图工作。