2016-04-24 9 views
0

Ich versuche herauszufinden, warum dieser Code nicht kompiliert, wenn Sie auf das Array von std::set namens asdf zugreifen. Ohne die Funktion getItem kompiliert der Code jedoch, wenn Sie in diesem Beispiel versuchen, auf ein Element von asdf zuzugreifen, z. B. Index 0. Der Compiler wird diesen Fehler auslösen. HierArray von std :: set und Komparator

main.cpp(21): error C2440: 'return': cannot convert from 'const std::set<test *,test::compare,std::allocator<_Kty>>' to 'const std::set<test *,std::less<_Kty>,std::allocator<_Kty>> &' 
     with 
     [ 
      _Kty=test * 
     ] 
main.cpp(21): note: Reason: cannot convert from 'const std::set<test *,test::compare,std::allocator<_Kty>>' to 'const std::set<test *,std::less<_Kty>,std::allocator<_Kty>>' 
     with 
     [ 
      _Kty=test * 
     ] 
main.cpp(21): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 

ist das Beispiel:

#include <set> 

struct test { 
    int idx; 
    struct compare { 
     bool operator()(const test* a, const test* b) { 
      return a->idx < b->idx; 
     } 
    }; 
}; 


class asdf123 { 
public: 
    asdf123() { 

    } 

    const std::set<test*>& getItem() const 
    { 
     return asdf[0]; 
    } 

private: 
    typedef std::set<test*, test::compare> stuffType[100]; 
    stuffType asdf; 
}; 

int main() { 
    asdf123 a; 
    return 0; 
} 

Ohne den Komparator der Code funktioniert.

Antwort

0

std::set<test*, test::compare> und std::set<test*> sind unterschiedliche Typen und konnten nicht implizit von einem zum anderen konvertiert werden, deshalb beschwert sich der Compiler.

std::set hat zwei Standardvorlage Argumente, so wird std::set<test*, test::compare>

std::set<test*, test::compare, std::allocator<test*>> 

und std::set<test*> wird

std::set<test*, std::less<test*>, std::allocator<test*>> 

Sie sein könnte den Rückgabetyp von getItem() zu const std::set<test*, test::compare>& ändern, das Problem zu lösen.

+1

Vielleicht möchten Sie das erweitern: Es gibt keine implizite Konvertierung von diesen beiden Typen zu den anderen, daher die Kompilierungsfehler. – Peter

+0

Wow, wie habe ich vermisst, dass sie nicht übereinstimmende Typen hatten? Ich glaube, ich war mehr darauf aus, herauszufinden, was der kryptische Compilerfehler war. –

+0

@BrandanTylerLasley Es gibt immer noch Hinweise in der Fehlermeldung, vor allem die beiden Typen, die nicht konvertiert werden konnten. – songyuanyao

Verwandte Themen