2008-11-20 7 views
38

Ist es möglich, einen STL-Container in einer Header-Datei weiterzuleiten? Nehmen wir zum Beispiel den folgenden Code:Vorwärts deklarieren Sie einen STL-Container?

#include <vector> 

class Foo 
{ 
private: 
    std::vector<int> container_; 
    ... 
}; 

ich in der Lage sein, so etwas zu tun:

namespace std 
{ 
    template <typename T> class vector; 
} 

class Foo 
{ 
private: 
    std::vector<int> container_; 
    ... 
}; 

Kann dies geschehen?

Antwort

27

Die Deklaration vector im Namespace std ist undefined Verhalten. Ihr Code funktioniert möglicherweise, aber möglicherweise auch nicht, und der Compiler ist nicht verpflichtet, Ihnen mitzuteilen, wann Ihr Versuch nicht funktioniert. Das ist ein Glücksspiel, und ich weiß nicht, dass es sich lohnt, die Aufnahme eines Standard-C++ - Headers zu vermeiden.

Siehe folgende comp.std.C++ moderierte Diskussion:.

forward declaring std::vector. Works, but is it legal and standard compliant?

+1

Ich folgte Ihrem Link zu der Diskussion, aber die Leute scheinen nicht zu einer Schlussfolgerung zu kommen. Offensichtlich darf die stl-Implementierung den Standardcontainern keine Vorlagenparameter hinzufügen. Daher sollte es erlaubt sein, die Vorlage weiterzuleiten. – Haplo

+1

Es ist nicht definiert, @Haplo. Wenn die von dir verwendete Implementierung * das Verhalten über das hinaus definiert, was der Standard sagt, ist das großartig, aber es ist immer noch undefiniert, also wird dein Code nicht portierbar sein. Die Schlussfolgerung (nach unwidersprochenen Anweisungen zu urteilen) ist, dass der Standard dies zulässt, aber nicht, und dass es zwei Problemumgehungen gibt: Umbrechen Sie die Standardtypen in vorwärts deklarierte Benutzerstrukturen, oder beißen Sie einfach das Aufzählungszeichen und fügen Sie den Standardkopf ein . Letzteres ist einfach zu machen. –

+1

"Unverbotene Aussagen" im Usenet sind kaum eine maßgebliche Quelle. Aber Jerry Coffin hat recht, wenn er [namespace.std]/1 zitiert. In der Praxis, wenn Ihr Compiler 'Namespace std' Deklarationen in Nicht-System-Headern diagnostiziert, oder wenn Ihre Standard-Bibliothek nicht in C++ implementiert ist, könnten Sie ein Problem haben, aber diese Dinge passieren nie – Potatoswatter

16

Ich denke nicht, weil der Compiler keine Möglichkeit hätte zu wissen, wie viel Platz für das container_ Objekt zuzuordnen. Am besten könntest du:

std::vector<int> *container_; 

und neu im Konstruktor, da der Compiler die Größe eines Zeigers kennt.

+0

genau das, was ich gerade sagen wollte – badbadboy

+0

Richtig, aber das ist ein Problem mit allen forward-Deklarationen, nicht zu denen in 'namespace std'. Es beantwortet also die Frage "real", nicht die Frage, die OP gestellt hat. : P Wir können einfach etwas nicht weiterleiten und dann aus offensichtlichen Gründen instanziieren. –

8

Abgesehen von dem, was die anderen sagten (außer Adam Rosenfield), können Sie es nützlich finden wissen, dass es ein sanktioniert Weg Vorwärts-Deklarieren Iostreams und einige verwandte Vorlagen: Die Kopfzeile <iosfwd> (siehe http://msdn.microsoft.com/en-us/library/1af12yty%28VS.80%29.aspx). Es wäre nützlich, wenn der Standard mehr solcher Header hätte.

Verwandte Themen