2017-07-04 76 views
3

我想使用模板,但無法理解下面的代碼有什麼問題。模板類專業化:模板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_solve初始化爲參考nlp類。

從main.cpp中

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

我得到的錯誤如下所示。

錯誤:模板id '解決<>' 爲 '解決< 1> ::解決(NLP *)' 不匹配任何模板聲明 解決::解決(NLP *問題):m_ipopt(問題)

回答

4

您應該刪除template<>,即

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

template<>用於模板特(爲模板);但你只是定義了一個非模板成員函數(類模板專業化)。 (這就是爲什麼編譯器會抱怨,模板聲明不能被發現。)

4

該聲明在其原來的形式

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

是形式上有效本身。但是,它並沒有做你認爲它正在做的事情。該聲明聲明瞭一個明確的專業化爲主要模板

template<int ALG> 
class solve 
{ 
    ... 

它有沒有關係,您明確分工的成員

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

編譯器正試圖專注主模板的構造solve<ALG>::solve(nlp* problem)。但是,主模板沒有這樣的構造函數。因此,錯誤消息告訴你:編譯器不明白你想要專門化的構造函數,它無法在主模板中找到匹配的成員。

例如,你可以使用這個語法來明確地專注主模板

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

的默認構造函數這將編譯罰款,因爲主要的模板確實有這樣的構造。 (注意,你不必爲此明確地專門化整個類,你可以明確地專門化構造函數。)

你的意圖是很明顯,完全不同:對於在類模板特構造

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

爲正確的語法不應該提及template<>

solve<IPOPT>::solve(nlp* problem): m_ipopt(problem) 
{ 
} 
提供定義