it-swarm.com.de

"Implizite Instantiierung einer undefinierten Vorlage" beim Weiterleiten deklarierender Vorlagenklasse

Ich habe einen Code, in dem ich eine Template-Klasse vorwärts deklarieren muss (oder zumindest das Forward-Deklarieren würde mir die Sache sehr erleichtern ...). Ich habe eine vereinfachte Version des Problems geschrieben, das ich habe, damit ich es hier anzeigen kann:

template<bool>
class MyTemplateClass;

int main( int argc, char* argv[] )
{
    MyTemplateClass<false> myTemp;  // error here
    myTemp.GetTheValue();
    return 0;
}

template<bool bShouldMult>
class MyTemplateClass
{
    int m_myint;
    float m_myfloat;

public:
    MyTemplateClass() : m_myint(5), m_myfloat(3.0f) {}
    float GetTheValue()
    {
        return m_myint * (bShouldMult ? m_myfloat : 1.0f);
    }   

};

Die Fehlermeldung, die ich in der kommentierten Zeile bekomme, lautet:

Error - implicit instantiation of undefined template 'MyTemplateClass<false>'

Welches weitere Detail muss ich in eine Vorwärtsdeklaration von MyTemplateClass aufnehmen? Da der Fehler nicht aus der nächsten Zeile kommt, gehe ich davon aus, dass die Methode nicht definiert ist. Der Compiler, den ich verwende, ist LLVM/CLang, und ich kompiliere auf Mac.

24
benwad

Um eine Variable eines beliebigen Typs, einer Vorlage oder nicht zu deklarieren, muss die gesamte Definition dieses Typs verfügbar sein. Sie können eine Vorlage nicht weiterleiten und beginnen, sie so zu verwenden, als wäre sie definiert. Alles, was Sie zu diesem Zeitpunkt tun können, ist das Deklarieren eines Zeigers auf ein Objekt eines Typs, der auf der Vorlage basiert, wie folgt:

MyTemplateClass<false> *myTempPtr;  // No error here

Leider (aber nicht unerwartet) wird der Fehler in die nächste Zeile verschoben. Das Problem beim Initialisieren dieses Zeigers bleibt bestehen: Wenn Sie versuchen, new MyTemplateClass<false> aufzurufen, wird ein Fehler angezeigt.

Sie müssen Ihren Code neu anordnen, um die Definition der Vorlage vor den Verwendungsort zu verschieben. Dies kann etwas mühsam sein, aber es gibt keinen Weg daran vorbei: Der Compiler muss die gesamte Definition an dem Punkt haben, an dem Sie Ihre Vorlage instanziieren und ihre Methoden aufrufen.

21
dasblinkenlight

Hast du vergessen etwas zu #include?

Ich bekam das, nachdem ich vergessen hatte 

#include <array>

Bei Verwendung eines std::array

: ^)

49
kmiklas

Nach meinem Verständnis können Sie etwas nicht weiter deklarieren und dann in Ihrem Stack instanziieren (Vorlage oder nicht).

Ich glaube auch nicht, dass es eine sehr breite Unterstützung für die Vorwärtsdefinition der Vorlagenklasse gibt

0
Arthur