(Include)Abhängigkeiten bei Templateklassen.
-
Hallo,
ich weiß nicht wie ich folgende Abhängigkeiten am besten Auflösen soll.
Klasse A hat eine Templatemethode, diese Templatemethode wrappt eine Templatemethode von Klasse B.
Klasse B hat eine Templatemethode und wrappt eine Templatemethode von Klasse A.
Jetzt fragt bitte nicht warum
.Das Problem ist, dass ich das mit Vorwärtsdeklarationen nicht aufgelöst bekomme. Zwischen Schnittstelle und Implementation kann ich ja auch nicht trennen, da es sich um zwei Templatemethoden handelt. Ich erhalte immer diese Meldung:
**
B error: incomplete type `A' used in nested name specifier
**Gibt's da noch eine andere Lösung oder muss ich zwangsläufig das Design umstellen?
-
Warum brauchst du das?
So funktioniert es auf jeden Fall bei mir, wenn ich dich richtig verstanden habe:
struct A { template <typename T> void foo(); template <typename T> void bar() { std::cout << "A::bar()\n"; } }; struct B { template <typename T> void foo() { std::cout << "B::foo()\n"; } template <typename T> void bar() { A a; a.bar<T>(); } }; // Darauf musst du achten. template <typename T> void A::foo() { std::cout << "A::foo()\n"; B b; b.foo<T>(); }Vielleicht habe ich mich vertippt. Mein Entwicklungspc hat keinen Internetanschluss. Und umgekehrt auch.
-
Delryn schrieb:
Zwischen Schnittstelle und Implementation kann ich ja auch nicht trennen, da es sich um zwei Templatemethoden handelt. Ich erhalte immer diese Meldung:
**
B error: incomplete type `A' used in nested name specifier
**eine trennung zwischen deklaration und implementation der funktionen des klassentemplates kann sehr wohl erfolgen (und der fehler tritt ja wahrscheinlich erst bei letzterem ein). dies kann z.b. dadurch erreicht werden, dass die implementation in eine eigene datei ausglagert wird und dann erst am ende des headers, der das klassentemplate enthält, eingebunden wird (jedenfalls nachdem der header, der das zweite template enthält inkludiert wurde).
etwa:
A.h#ifndef A_H_INCLUDED #define A_H_INCLUDED template<typename foo> class B; // deklaration falls gebraucht template<typename foo> class A { //.. }; #include "B.h" #include "A.inl" #endifB.h
#ifndef B_H_INCLUDED #define B_H_INCLUDED template<typename foo> class A; template<typename foo> class B { //.. }; #include "A.h" #include "B.inl" #endifA.inl
// hier die definitionen der funktionen des templates AB.inl
// hier die definitionen der funktionen des templates B