2017-01-04 2 views
0

Linux-Kompilierungsfehler - Typ 'string' kann nicht in 'string & &' konvertiert werden, wenn in eine Map eingefügt wird, die string enthält. Dasselbe gilt für Windows. Mein Anwendungsfall:Linux-Kompilierungsfehler - kann den Typ 'string' nicht in den Typ 'string &&' konvertieren

void insertIf(std::string str1, int value, std::map<std::string,int> &myMap) const 
{ 
    if(value == 1) 
    { 
     myMap.insert(std::make_pair<std::string, int>(str1, value));  
    } 
} 
+1

Können wir eine [mcve] haben? – user4581301

+1

Tippfehler? 'arg1.insert (std :: make_pair (str1, int1));' <- '))' – Unimportant

Antwort

1

Das ist, weil std::make_pair nimmt Bezug als Parameter weitergeleitet wird. Sie sollten std::make_pair mit einem deduzierenden Kontext und dem Konstruktor std::pair verwenden, wenn Sie den Vorlagenparameter explizit angeben möchten.

Hier sind Ihre Möglichkeiten:

make_pair:

void insertIf(std::string str1, int value, std::map<std::string,int>& myMap) { 
    if(value == 1 { 
     myMap.insert(std::make_pair(str1, value)); 
    } 
} 

Paar Konstruktor

void insertIf(std::string str1, int value, std::map<std::string,int>& myMap) { 
    if(value == 1 { 
     myMap.insert(std::pair<std::string, int>(str1, value)); 
    } 
} 

Noch besser, emplace:

void insertIf(std::string str1, int value, std::map<std::string,int>& myMap) { 
    if(value == 1 { 
     myMap.emplace(str1, value); 
    } 
} 

Wenn Sie wirklich std::make_pair mit expliziter Parameter verwenden möchten, können Sie den Wert der Kategorie in der Template-Parameter angeben können, aber ich rate Ihnen diese nicht zu tun, besiegt es irgendwie die ganze Zweck der std::make_pair:

void insertIf(std::string str1, int value, std::map<std::string,int>& myMap) { 
    if(value == 1 { 
     myMap.insert(std::make_pair<std::string&, int&>(str1, value)); 
    } 
} 

Edit: es unter Windows funktioniert, weil Sie eine veraltete Version von VS verwenden müssen, die Weiterleitung Referenz noch nicht unterstützen.

Verwandte Themen