2017-07-04 5 views
3

Ich versuche, Vorlagen zu verwenden, konnte aber nicht verstehen, was falsch ist mit unten Code.Vorlage Klassenspezialisierung: Vorlage-ID stimmt nicht mit Vorlage Deklaration

solve.h

#include "nlp.h" 
#include "Ipopt_solve.h" 

enum algo_type {IPOPT =1, SQP}; 

template<int ALG> 
class solve 
{ 
public: 
    solve() 
    { 
    } 
}; 

template<> 
class solve<IPOPT> 
{ 
public: 
    solve(nlp*); 

private: 
    Ipopt_solve m_ipopt; 

}; 

solve.cpp

template<> 
solve<IPOPT>::solve(nlp* problem): m_ipopt(problem) 
{ 
} 

Ipopt_solve ist eine Unterklasse einer abstrakten Klasse TNLP. Ipopt_solve wird mit einem Verweis auf nlp Klasse initialisiert.

von main.cpp

nlp problem(&model); 
solve<IPOPT> solution(&problem); 

Ich erhalte den Fehler wie unten gezeigt.

Fehler: template-id 'lösen <>' für 'lösen < 1> :: lösen (nlp *)' passt nicht jede Template-Deklaration lösen :: lösen (nlp * Problem): m_ipopt (Problem)

Antwort

4

Sie sollten template<> entfernen, dh

// template <> 
solve<IPOPT>::solve(nlp* problem): m_ipopt(problem) 
{ 
} 

template<> für Template-Spezialisierung verwendet wird (für eine Vorlage); aber Sie definieren nur eine Nicht-Template-Member-Funktion (einer Klassenvorlagen-Spezialisierung). (Deshalb ist der Compiler beschwert sich, dass die Template-Deklaration kann nicht gefunden werden.)

4

Diese Erklärung in seiner ursprünglichen Form

template<> 
solve<IPOPT>::solve(nlp* problem): m_ipopt(problem) 
{ 
} 

selbst formal gültig ist. Es tut jedoch nicht, was es zu tun scheint. Diese Erklärung erklärt eine explizite Spezialisierung für ein Mitglied der Hauptvorlage

template<int ALG> 
class solve 
{ 
    ... 

Es hat keinen Bezug auf Ihre explizite Spezialisierung Konstruktor solve<ALG>::solve(nlp* problem)der Hauptvorlage zu spezialisieren

template<> 
class solve<IPOPT> 
{ 
    ... 

Der Compiler versucht hat. Die Hauptvorlage hat jedoch keinen solchen Konstruktor. Daher die Fehlermeldung, die Ihnen genau das sagt: Der Compiler versteht nicht, auf welchen Konstruktor Sie sich spezialisieren wollen, er kann das passende Element in der Hauptvorlage nicht finden.

Zum Beispiel können Sie diese Syntax verwenden explizit den Standardkonstruktor der Hauptvorlage

template<> 
solve<SQP>::solve() 
{ 
    // Specialized code for `solve<SQP>`'s default constructor 
} 

Diese feine kompilieren zu spezialisieren, da die Hauptvorlage in der Tat solche Konstruktor hat. (Beachten Sie, dass Sie nicht explizit die gesamte Klasse dafür spezialisieren müssen, Sie können den Konstruktor nur explizit spezialisieren.

)

Ihre Absicht war, natürlich, ganz anders: Definition für den Konstruktor in der Klasse Template-Spezialisierung bieten

template<> 
class solve<IPOPT> 
{ 
    ... 

Die richtige Syntax für das nicht template<>

solve<IPOPT>::solve(nlp* problem): m_ipopt(problem) 
{ 
} 
erwähnen sollte
Verwandte Themen