2010-06-10 33 views
6

Więc staram się trochę kodu, który został napisany dla gcc do kompilacji w Visual Studio 2008. Mam problem, że mam zawężony do tego:Dlaczego nie deklaracja ta klasa działa na Visual Studio

class value_t 
{ 
public: 
    typedef std::deque<value_t>   sequence_t; 
    typedef sequence_t::iterator  iterator; 
}; 

Kod ten nie powiedzie się:

1>cpptest.cpp 
1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'value_t' 
1>  c:\temp\cpptest\cpptest.cpp(10) : see declaration of 'value_t' 
1>  c:\temp\cpptest\cpptest.cpp(13) : see reference to class template instantiation 'std::deque<_Ty>' being compiled 
1>  with 
1>  [ 
1>   _Ty=value_t 
1>  ] 
1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'value_t' 
1>  c:\temp\cpptest\cpptest.cpp(10) : see declaration of 'value_t' 

jednak gdy próbuję to z std :: vector, kompiluje grzywny:

class value_t 
{ 
public: 
    typedef std::vector<value_t>  sequence_t; 
    typedef sequence_t::iterator  iterator; 
}; 

Wh jest źle? Próbowałem dodać "typename" wszędzie, gdzie mogę myśleć, ale w tym momencie myślę, że to tylko błąd w Dinkumware STL. Czy ktoś może wyjaśnić, co się dzieje i/lub zaoferować rozwiązanie? Dzięki.

+1

Czy "wszędzie można wymyślić" to 'typedef nazwa_pytału sequence_t :: iterator iterator;'? – Stephen

+0

Możesz wypróbować deklarację forward przed deklaracją klasy. tj. klasa value_t; –

+0

To się zawsze dzieje - zaraz po tym, jak opublikuję to pytanie, znajduję magiczną kombinację w google, aby dać mi coś istotnego. Zobacz http://www.gamedev.net/community/forums/topic.asp?topic_id=295828, który omawia ten temat; nadal nie oferuje rozwiązania. Czy ktoś może potwierdzić, że używanie deque w tej sytuacji jest niestandardowe? Czy istnieje sposób, aby to zadziałało bez zmiany pliku ? – Roel

Odpowiedz

7

Jego niezdefiniowane zachowanie. Zobacz this link na clC++ moderowany

Snip z odpowiedzią Daniel K za: -.

ten ++ standard C (zarówno C++ 03 i C++ 0x) mówi, że to, co staramy przyczyn niezdefiniowane zachowanie patrz [lib.res.on.functions]/2:

„w szczególności, efekty są zdefiniowana w następujących przypadkach: [..] - jeśli niekompletna rodzaju (3,9) jest używany jako argument szablonu przy tworzenie instancji komponentu szablonu. "

+0

Dziękuję, że wątek wyjaśnia to najbardziej szczegółowo, jaki mógłbym kiedykolwiek chcieć. Chyba będę musiał zmienić kod. – Roel

1

Próbujesz użyć klasy w sobie w szablonie. Jak to rozwiązuje? Nie wiem, czy kiedykolwiek próbowałam to zrobić, ale czy to jest nawet możliwe? Nie wiem, dlaczego działa na std :: vector, ale moim założeniem jest, że jest źle. Definiujesz klasę i używasz tej definicji w definicji. Wydaje mi się nie tak. Powodzenia na ten jeden, będę zainteresowany, aby zobaczyć jakieś głębsze ODPOWIEDZI sobie ...

+0

Działa na std :: vector, a na gcc ten kod również kompiluje się dobrze. Sądzę, że tak długo jak sizeof (klasa) jest znana, to wystarczy. To najwyraźniej potknęło ludzi w linku, który zamieściłem w komentarzu. Robię to z wektorem od lat - tylko zbieg okoliczności, że to zadziałało, jak sądzę. – Roel

5

myślę problemem jest to, że value_t jest niekompletny typ aż dojdziesz do końca definicji. Próba użycia niekompletnego typu jako parametru szablonu dla standardowego kontenera nie powinna działać. Może/będzie działać w pewnych okolicznościach, ale jeśli zawiedzie wszystkie standardowe typy kontenerów, to nadal nie będzie sygnalizować żadnego błędu. Standard wymaga, aby był kompletny, więc jeśli nie jest, dostajesz to, co dostajesz - prawdopodobnie powinno być konsekwentnie niezgodne z, ale jeśli to zadziała, nie ma w tym nic złego.

Powiązane problemy