Forward declaration, Template
-
Hallo!
Ich möchte einen Pointer auf ein Klassentemplate Tree<..> machen und dazu
Tree<..> vorwärts deklarieren. Der Typ, mit dem Tree parametrisiert wird,
ist ebenfalls vorwärts deklariert. Zwei Versuche:class SomeForwardDeclaredType; // Fwd declaration template class Tree<SomeForwardDeclaredType> // Fwd declaration typedef boost::shared_ptr<Tree> PointerToTree;
Es folgt: "error: ‘Tree’ is not a template". Natürlich ist das *.h-File von
Tree hier noch nicht inkludiert, das ist ja der Sinn der Vorwärts-Deklaration.
Warum glaubt mir der Compiler nicht, daß es sich um ein Klassentemplate handelt?class Tree; // Fwd typedef boost::shared_ptr<Tree> PointerToTree;
Hier habe ich erst mal außer Acht gelassen, daß Tree tatsächlich ein Klassen-
template ist. Dann kann ich zwar den Pointer typedef'en, aber später wenn
ich den Tree verwenden möchte, bekomme ich:conflicting declaration ‘typedef class SEARCH::Tree<SomeForwardDeclaredType> Tree’
common.h:86:7: error: ‘struct Tree’ has a previous declaration as ‘struct Tree’..wobei die Tree-Klasse im Namespace SEARCH liegt. Muß das auch noch
irgendwie berücksichtigt werden?
-
template <typename T> class mein_template; class andere_klasse; mein_template<andere_klasse> *pointer;
-
SeppJ schrieb:
template <typename T> class mein_template; class andere_klasse; mein_template<andere_klasse> *pointer;
Danke, das geht. ABER: Wie gehst Du syntaktisch vor, wenn mein_template und
andere_klasse in einem Namespace liegen? XYZ:: kann ich bei der Forward-
Deklaration nicht schreiben, denn der Namespace ist noch nicht bekannt.mein_template.h #pragma once namespace XYZ { template<class T> class mein_template { T x; }; }
andere_klasse.h: #pragma once namespace XYZ { class andere_klasse { }; }
common.h: #pragma once #include "boost/shared_ptr.hpp" template <typename T> class mein_template; // FWD class andere_klasse; // FWD typedef boost::shared_ptr<mein_template<andere_klasse> > PtrMyT; // TYPEDEF
test.cpp #include "common.h" #include "mein_template.h" #include "andere_klasse.h" int main(int,char**) { PtrMyT pMyT(new mein_template<andere_klasse>); return 0; }
test.cpp:112:18: error: invalid use of incomplete type ‘struct mein_template<andere_klasse>’ common.h:11:29: error: declaration of ‘struct mein_template<andere_klasse>’
-
fwdc schrieb:
SeppJ schrieb:
template <typename T> class mein_template; class andere_klasse; mein_template<andere_klasse> *pointer;
Danke, das geht. ABER: Wie gehst Du syntaktisch vor, wenn mein_template und
andere_klasse in einem Namespace liegen? XYZ:: kann ich bei der Forward-
Deklaration nicht schreiben, denn der Namespace ist noch nicht bekannt.Argh, hat sich erübrigt: namespace XYZ {..} um die Vorwärtsdeklaration
schreiben!