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?


  • Mod

    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!


Anmelden zum Antworten