传递内容作为此参数会丢弃限定符

时间:2015-06-22 16:44:59

标签: c++ c++11

使用下面的代码,我得到以下编译错误:

In static member function ‘static std::string ctedata::Record::getDispatcher<std::basic_string<char> >::impl(const ctedata::Record&, const string&)’:
/home/jason/CrownTheEmpire/lib/ctedata/data.h:111:38: error: passing ‘const std::map<std::basic_string<char>, std::basic_string<char> >’ as ‘this’ argument discards qualifiers [-fpermissive]
         return rec.fieldValues_[field];
                                      ^
In file included from /usr/include/c++/5.1.0/map:61:0,
                 from /usr/include/cppconn/connection.h:30,
                 from /usr/include/cppconn/driver.h:30,
                 from /home/jason/CrownTheEmpire/lib/ctedata/data.h:6,
                 from /home/jason/CrownTheEmpire/lib/ctedata/data.cc:3:
/usr/include/c++/5.1.0/bits/stl_map.h:471:7: note:   in call to ‘std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const key_type&) [with _Key = std::basic_string<char>; _Tp = std::basic_string<char>; _Compare = std::less<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = std::basic_string<char>; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = std::basic_string<char>]’
       operator[](const key_type& __k)
       ^

class Record
{
  public:
    Record() {
        isNew_ = true;
    }
    Record(sql::ResultSet *resultSet) : resultSet_(resultSet) {
        isNew_ = false;
    }

    void loadData();
    virtual void init() = 0;

    bool isNew() { return isNew_; }
    void setValue(const std::string& field, const std::string& value);
    template<typename T>
    T getValue(const std::string& field) const {
        return Record::getDispatcher<T>::impl(*this, field);
    }
  protected:
    sql::ResultSet* resultSet_;
    bool isNew_;
    std::map<std::string, DataTypes> fieldDataTypes_;
    std::map<std::string, std::string> fieldValues_;
  private:
    template<typename T>
    struct getDispatcher;
};

template<>
struct Record::getDispatcher<std::string> {
    static std::string impl(Record const& rec, std::string& const field) {
        return rec.fieldValues_[field];
    }
};

template<>
struct Record::getDispatcher<int> {
    static int impl(Record const& rec, const std::string& field) {
        return 0;
    }
};

我认为我正在做正确的事情,但仍然得到这个我无法弄清楚的错误。任何人都可以看到我哪里出错了?感谢。

1 个答案:

答案 0 :(得分:2)

operator[] std::map constat,您必须使用findtemplate<> struct Record::getDispatcher<std::string> { static std::string impl(Record const& rec, std::string& const field) { return rec.fieldValues_.at(field); // throw if field is not in map. } };

template<>
struct Record::getDispatcher<std::string> {
    static std::string impl(Record const& rec, std::string& const field) {
        auto it = rec.fieldValues_.find(field);
        if (it == rec.fieldValues_.end()) {
            // not found.
            // Manage the case, return default value or throw.
        } else {
            return it->second;
        }
    }
};

{{1}}