【问题标题】:C++ expected type-specifierC++ 预期的类型说明符
【发布时间】:2013-01-10 14:59:17
【问题描述】:

背景

我正在为 Arduino 编写类似 stl 的容器 project。到目前为止,我已经成功编写了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_;

};

【问题讨论】:

    标签: c++ compiler-errors g++


    【解决方案1】:

    pair 只是一个模板,而不是一个类型。编译器需要模板参数,在这种情况下是类型。也就是说,它期望你的行是:

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

    不,不能推导出模板参数;这仅适用于模板函数,不适用于类型。

    【讨论】:

    • ...这就是标准库包含en.cppreference.com/w/cpp/utility/pair/make_pair的原因。
    • @NateKohl 是的,标准库包含几个实用函数,例如 make_pair 正是出于这个原因。尽管在这种情况下它没有帮助,即使 OP 可以使用标准库(我认为不是这种情况)。
    【解决方案2】:

    new pair&lt;K,V&gt;( p ) 是它想要的。

    对于我自己,我会在vector 之上实现一个平面地图,因此我不必在其中进行内存管理。这样做的一个优点是您可以删除一个间接级别。 (间接是性能杀手)。

    另一个想法是要有一个高水位分拣标记,分拣标记之前的东西被分类,而它之后的东西是杂乱无章的。当容器变大时,这可以减少比较。但首先要让您的平面地图正常工作。

    【讨论】:

    • 我从未听说过高水位分选,我得研究一下。我不在vector 之上构建map 的原因是因为我希望每个容器类型彼此独立。将来可能会有一段时间,程序员可能只想在他们的项目中包含一个容器类型。
    • @Nathan 然后编写一个“托管数组”并让vector 成为它的裸包装,map 是一个稍微复杂的包装。编写两次内存管理内容意味着两倍的错误,以及一半的优化性能提升。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    相关资源
    最近更新 更多