簡體   English   中英

C ++期望的類型說明符

[英]C++ expected type-specifier

背景

我正處於為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_;

};

pair只是一個模板,而不是一個類型。 編譯器期望模板參數,在這種情況下是類型。 這是,它期待您的行:

_items_[_size_ - 1] = new pair<K,V>( p );

不,它不能推斷出模板參數; 這僅適用於模板功能,而不適用於類型。

new pair<K,V>( p )就是它想要的東西。

對於我自己,我會在vector上實現平面地圖,所以我不必在其中進行內存管理。 這樣做的一個優點是您可以刪除一個間接級別。 (間接是性能殺手)。

另一個想法是有一個高水分類標記,排序標記之前的東西被排序,之后的東西是混亂的。 當容器變大時,這可以減少對比。 但首先讓你的平面地圖工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM