2016-06-04 5 views
0

Это мое первое сообщение - извините, если я исповедую какие-либо соглашения с сайтом. Просьба указать любые ошибки, которые я делаю, чтобы я мог их исправить/не повторять.std :: map: перегрузка оператора <с параметром, отличным от класса ключа

This post may be related

c++ reference: std::map

c++ reference: std::map - rational operators

Я хочу, чтобы иметь возможность использовать std::map «s operator[] положив std::string между кронштейнами - даже несмотря на то ключ map не std::string ,

вот код

class myKey 
{ 
public: 
    std::string _name; 

    myKey(std::string name) 
    { 
     _name = name; 
    } 

    bool operator<(const myKey& other) const 
    { 
     if (this->_name < other._name) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
}; 

int main() 
{ 
    std::map<myKey, int> map; 
    myKey temp("keyString"); 
    map[temp] = 1; 
    std::cout << map[temp]; 

    system("pause"); 
    return 0; 
} 

До сих пор это работает отлично - но как вы можете видеть, единственное, что оператор использует это std::string _name поле класса. Я не смогу найти значение на карте, просто введя строку так: map["keyString"].

Я попытался перегрузить operator< из myKey, но это не помогло.

bool operator<(const std::string name) const 
{ 
    if (this->_name < name) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Как это можно сделать?

+0

вы пытались добавить 'MYKEY :: MYKEY (Const символ * имя)'? – nwp

ответ

1

"" является строковым литералом типа const char*. Причина, по которой он не работает, когда вы делаете map["keyString"], состоит в том, что "keyString" сначала необходимо преобразовать в std::string, а затем его можно передать как ключ.

Но, поскольку он должен быть преобразован (до std::string), во-первых, это незаконно.

Вы можете просто добавить конструктор, который принимает const char*:

myKey(const char* name) : _name{ name } {} 

Если вы не хотите, чтобы добавить новый конструктор, вы можете использовать std::string_literals::operator""s.

using namespace std::string_literals; 

//Note 's' after "", this means that "keyString" is of type std::string, not const char* 
map["keyString"s] = 1; 
0

С уважением, rakete - вы указали на проблему. Но есть более простое решение: шаги:

  1. перегружать operator< с помощью метода, который принимает параметр, который вы хотите (в данном случае, std::string.Убедитесь, что вы используете правильную сигнатуру функции проверки мои operator< функций

  2. При попытке получить значение в карте с помощью operator[] убедитесь, что вы вводите правильное значение в скобках (это то, что я сделал неправильно , вошел в string literal как это - map["keyString"] вместо ввода std::string как это - map[std::string("keyString")]

 Смежные вопросы

  • Нет связанных вопросов^_^