2012-06-22 4 views
6

Mam projekt działa poprawnie pod MSVS 2010 SP1. Próbuję przekonwertować go do MSVS 2012 RC. Musiałem zmienić kilka rzeczy, głównie związanych ze ścieżkami nagłówka/lib C++ i niestandardowymi materiałami MFC. Ale mam jedną ostatnią przeszkodę do wyjaśnienia.Konwertowanie projektu MSVS 2010 na MSVS 2012 RC, ale pojawia się błąd "Standard C++ nie zapewnia skrótu dla tego typu"

W MSVC 2010, używam wielu unordered_map<basic_string<TCHAR>, int> lub map<basic_string<TCHAR>, int>. Kompiluje się dobrze. Ale w MSVS 2012, właśnie dostaję ten błąd: "Standard C++ nie zapewnia skrótu dla tego typu"

Po przeszukaniu trochę w sieci, dowiedziałem się, że MSVS 2012 powinien być bardziej zbliżony do Standard C++ 11 oraz że standard definiuje tylko funkcje mieszania dla typów podstawowych i 4 zdefiniowane typy łańcuchów (wśród nich: string i wstring, ale nie obejmuje basic_string). Więc zmieniłem wszystko basic_string<TCHAR> na wstring, ale bezskutecznie. Nadal dostaję ten sam błąd.

Co należy zrobić, aby móc ponownie skompilować moją aplikację?

+0

Prawdopodobnie w VS2010 miałeś wyłączony wielobajtowy, więc 'TCHAR' zamapowany na' char', a teraz masz włączone znaki wielobajtowe, więc 'TCHAR' zamienia się na' wchar_t'. Spróbuj zmienić te ustawienia we właściwościach projektu. – RedX

+1

'basic_string ' jest albo 'std :: string' lub' std :: wstring' (oba tylko typedefs), w zależności od ustawień projektu. Jedyna różnica w C++ 11 polega na tym, że łańcuch 'hash <>' jest teraz w '', a nie ''. –

+0

Dzięki Bo, musiałem dodać wszędzie, zanim nie musiałem tego robić. Muszę poczekać 6 godzin, zanim będę mógł udzielić odpowiedzi ... W międzyczasie, możesz to zrobić samemu :) – OOEngineer

Odpowiedz

8

Najwyraźniej OOEngineer użył basic_string bez nagłówka <string>. Część funkcji może być widoczna w każdym razie, poprzez pośrednie obejmuje inne nagłówki.

Po zwolnieniu VS2010, proponowany wówczas standard umieścił wszystkie specjalizacje std::hash<> w nagłówku <functional>. W finale standard C++ 11 zdecydowano, że lepiej było umieścić je wraz z odpowiednim pojemniku, więc niektórzy hash<> specjalizacje zostały przeniesione do <string>, <vector> itp

Tak więc, aby stosować wszystkie (lub dowolny , naprawdę) funkcjonalność std::string, musisz sam dołączyć nagłówek <string> i nie polegać na innym nagłówku systemu, który to robi.