gpt4 book ai didi

c++ - 模板类特化 : template-id does not match any template declaration

转载 作者:太空狗 更新时间:2023-10-29 20:02:13 24 4
gpt4 key购买 nike

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

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

};

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

我收到如下所示的错误。

错误:'solve<1>::solve(nlp*)' 的模板 ID 'solve<>' 与任何模板声明都不匹配 解决::解决(nlp*问题):m_ipopt(问题)

最佳答案

本声明的原始形式

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)
{
}

关于c++ - 模板类特化 : template-id does not match any template declaration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44898822/

24 4 0