2015-04-27 19 views
15

Proszę wyjaśnić, dlaczego poniższy kod nie został skompilowany za pomocą clang 3.5.Niepowodzenie kompilacji związane z wektorem const std :: string

Zgłoszono błąd "Nie da się przeładować" = "w algorytmie".

std::vector<const std::string> m_messages; 
std::vector<const std::string>::iterator iter; 
... 

if (iter != m_messages.end()) 
{ 
    m_messages.erase(iter);  // compilation error 
} 

Jeśli oświadczam m_messages jak: std::vector<std::string> m_messages; następnie kompiluje OK.

Również jaka jest różnica pomiędzy:

std::vector<const std::string> m_messages; 

i

std::vector<std::string> m_messages; 

TIA.

Odpowiedz

16

Aby skasować element, należy przesunąć elementy po prawej stronie (przesunąć w lewo).

Ponieważ twoje struny są const, starego elementu nie można nadpisać (przez operatora =), stąd błąd.

+0

Czy to znaczy, że nie ma sensu mieć wektor const ciągi znaków, jeśli elementy można usunąć? – ksl

+0

Nie jestem do końca pewien, czy jestem na tyle zorientowany, aby to potwierdzić, ale z tym, jak wektor jest zaimplementowany, wydaje się, że tak jest, ale z pewnością ma sens pojemnik, który to obsługuje (np. Przez konstruktor destructor + copy). może jest coś w bibliotece boost? –

+0

OK dzięki. Może będę jako osobne pytanie odnoszące się do tego, szczególnie jeśli nie otrzymam odpowiedzi tutaj. – ksl

5

Czy to oznacza, że ​​nie ma sensu posiadanie wektora ciągów stałych, jeśli elementy można usunąć? Yes at least what the standard says

23.3.7.5 wektor modyfikatory [vector.modifiers]

iteracyjnej wymazywania (pozycja const_iterator); Iterator wymazuje (const_iterator najpierw, const_iterator na końcu);

Efekty: Unieważnia iteratory i odniesienia w punkcie usuwania lub po nim.

Złożoność : Destruktor T nazywany jest liczbą razy równą liczbie usuniętych elementów, ale operatorem przypisania ruchu T nazywamy liczbę razy równą liczbie elementów w wektorze po wymazane elementy.

Zgłasza: Nic chyba jest wyjątek przez konstruktora kopiować, przenosić konstruktor, operator przypisania, lub przenieść operator przypisania T.

Powiązane problemy