2017-07-04 78 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) 
{ 
} 
提供定义