模板类专业化:模板 ID 不匹配任何模板声明

use*_*630 3 c++ templates template-specialization

我正在尝试使用模板,但无法理解以下代码有什么问题。

解决.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;

};
Run Code Online (Sandbox Code Playgroud)

解决.cpp

template<>
solve<IPOPT>::solve(nlp* problem): m_ipopt(problem)
{
}
Run Code Online (Sandbox Code Playgroud)

Ipopt_solve是抽象类的子类TNLPIpopt_solve使用对nlp类的引用进行初始化。

来自 main.cpp

nlp problem(&model);
solve<IPOPT> solution(&problem);
Run Code Online (Sandbox Code Playgroud)

我收到如下所示的错误。

错误:模板 id 'solve<>' for 'solve<1>::solve(nlp*)' 不匹配任何模板声明 solve::solve(nlp* problem): m_ipopt(problem)

AnT*_*AnT 5

本声明以其原始形式

template<>
solve<IPOPT>::solve(nlp* problem): m_ipopt(problem)
{
}
Run Code Online (Sandbox Code Playgroud)

本身是正式有效的。然而,它并没有做你认为它在做的事情。此声明为主模板的成员声明了显式特

template<int ALG>
class solve
{
  ...
Run Code Online (Sandbox Code Playgroud)

它与您的明确专业化无关

template<>
class solve<IPOPT>
{
  ...
Run Code Online (Sandbox Code Playgroud)

编译器试图专门solve<ALG>::solve(nlp* problem) 化主模板的构造函数。但是,主模板没有这样的构造函数。因此,错误消息准确地告诉您:编译器不了解您尝试专门化的构造函数,它无法在主模板中找到匹配的成员。

例如,您可以使用此语法显式特化主模板的默认构造函数

template<>
solve<SQP>::solve()
{
  // Specialized code for `solve<SQP>`'s default constructor
}
Run Code Online (Sandbox Code Playgroud)

这将编译得很好,因为主模板确实有这样的构造函数。(请注意,您不必为此显式特化整个类,您只需显式特化构造函数即可。)

显然,您的意图完全不同:在类模板特化中为构造函数提供定义

template<>
class solve<IPOPT>
{
  ...
Run Code Online (Sandbox Code Playgroud)

正确的语法不应提及 template<>

solve<IPOPT>::solve(nlp* problem): m_ipopt(problem)
{
}
Run Code Online (Sandbox Code Playgroud)