2017-07-04 14 views
3

テンプレートを使用しようとしていますが、下のコードで何が問題なのか理解できませんでした。テンプレートクラスの特殊化:template-idがテンプレート宣言と一致しません

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抽象クラスTNLPのサブクラスです。 Ipopt_solvenlpクラスを参照して初期化されます。以下に示すように、私はエラーを取得していますmain.cppに

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

から

エラー:テンプレート-idの '<>解決' '< 1>を解決するために::(NLP *)を解くには' 任意のテンプレート宣言 が解決一致していません::(NLP *問題)解決:m_ipopt(問題)

答えて

4

あなたはすなわち

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

template<>は、(テンプレートの)テンプレートの特殊化のために使用され、template<>を削除する必要があります。しかし、(クラステンプレートの特殊化の)テンプレート以外のメンバ関数を定義するだけです。 (コンパイラは、テンプレート宣言が見つからないことを不平を言う理由です。)

4

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

自体が正式に有効であり、元の形式でこの宣言。しかし、それはあなたが思っていることをやっていません。この宣言は、メインテンプレートそれはあなたの明示的な特殊とは関係ありません

template<int ALG> 
class solve 
{ 
    ... 

のメンバーの明示的な特殊化を宣言し、コンパイラは、メインテンプレートのコンストラクタsolve<ALG>::solve(nlp* problem)を専門にしようとしている

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

。ただし、メインテンプレートにはそのようなコンストラクタはありません。コンパイラは、どのコンストラクタを特殊化しようとしているのか分からず、メインテンプレート内の一致するメンバを見つけることができません。例えば

、あなたはメインテンプレートが実際に、このようなコンストラクタを持っていないので、これはうまくコンパイルされ、明示的にメインテンプレート

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

のデフォルトコンストラクタを専門とするために、この構文を使用することができます。 (クラス全体を明示的に特殊化する必要はなく、単にコンストラクタを明示的に特殊化することができます。)

あなたの意図は、明らかに、完全に異なっていた。そのための適切な構文がtemplate<>

solve<IPOPT>::solve(nlp* problem): m_ipopt(problem) 
{ 
} 
に言及してはならない

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

クラステンプレートの特殊化にコンストラクタの定義を提供するために、

関連する問題