Próbuję zaimplementować wektor jak i mapę jak operator [] dla klasy. Ale dostaję komunikaty o błędach z moich kompilatorów (g ++ i clang ++). Okazało się, że występują tylko wtedy, gdy klasa ma również operatory konwersji na typy całkowite."Niejednoznaczne przeciążenie dla" operatora [] "" jeśli operator konwersji int istnieje
Teraz mam dwa problemy. Po pierwsze, nie wiem, dlaczego kompilator nie może odróżnić [] (const std :: string &) i kiedy klasa ma operatory konwersji na ints. Drugi ... Potrzebuję konwersji i operatora indeksu. Czy ktoś wie, jak to naprawić?
z góry dzięki i pozdrawiam ze mną
utworów:
#include <stdint.h>
#include <string>
struct Foo
{
Foo& operator[](const std::string &foo) {}
Foo& operator[](size_t index) {}
};
int main()
{
Foo f;
f["foo"];
f[2];
}
nie działa: Błąd
#include <stdint.h>
#include <string>
struct Foo
{
operator uint32_t() {}
Foo& operator[](const std::string &foo) {}
Foo& operator[](size_t index) {}
};
int main()
{
Foo f;
f["foo"];
f[2];
}
kompilator:
main.cpp: In function 'int main()':
main.cpp:14:9: error: ambiguous overload for 'operator[]' in 'f["foo"]'
main.cpp:14:9: note: candidates are:
main.cpp:14:9: note: operator[](long int, const char*) <built-in>
main.cpp:7:7: note: Foo& Foo::operator[](const string&)
main.cpp:8:7: note: Foo& Foo::operator[](size_t) <near match>
main.cpp:8:7: note: no known conversion for argument 1 from 'const char [4]' to 'size_t {aka long unsigned int}'
Nie ma czegoś takiego jak "operator obsady". Dany operator to ** konwersja **. Obsada to coś, co piszesz w swoim kodzie źródłowym, aby powiedzieć kompilatorowi, aby zrobił konwersję. –
Dziękuję @Pete Becker za wskazanie tego. – r2p2