模板 class 专业化:模板 ID 不匹配任何模板声明
template class specialization : template-id does not match any template declaration
我正在尝试使用模板,但无法理解以下代码有什么问题。
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
是摘要 class TNLP
的子 class。 Ipopt_solve
通过对 nlp
class.
的引用进行初始化
来自 main.cpp
nlp problem(&model);
solve<IPOPT> solution(&problem);
我收到如下所示的错误。
错误:'solve<1>::solve(nlp*)' 的模板 ID 'solve<>' 不匹配任何模板声明
solve::solve(nlp* 问题): m_ipopt(问题)
您应该删除 template<>
,即
// template <>
solve<IPOPT>::solve(nlp* problem): m_ipopt(problem)
{
}
template<>
用于模板特化(对于一个模板);但你只是定义了一个非模板成员函数(class 模板专业化)。 (这就是编译器抱怨找不到模板声明的原因。)
此声明的原始形式
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
}
这会很好地编译,因为主模板确实有这样的构造函数。 (请注意,您不必为此显式特化整个 class,您可以只显式特化构造函数。)
您的意图显然完全不同:为 class 模板专业化中的构造函数提供定义
template<>
class solve<IPOPT>
{
...
正确的语法不应提及 template<>
solve<IPOPT>::solve(nlp* problem): m_ipopt(problem)
{
}
我正在尝试使用模板,但无法理解以下代码有什么问题。
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
是摘要 class TNLP
的子 class。 Ipopt_solve
通过对 nlp
class.
来自 main.cpp
nlp problem(&model);
solve<IPOPT> solution(&problem);
我收到如下所示的错误。
错误:'solve<1>::solve(nlp*)' 的模板 ID 'solve<>' 不匹配任何模板声明 solve::solve(nlp* 问题): m_ipopt(问题)
您应该删除 template<>
,即
// template <>
solve<IPOPT>::solve(nlp* problem): m_ipopt(problem)
{
}
template<>
用于模板特化(对于一个模板);但你只是定义了一个非模板成员函数(class 模板专业化)。 (这就是编译器抱怨找不到模板声明的原因。)
此声明的原始形式
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
}
这会很好地编译,因为主模板确实有这样的构造函数。 (请注意,您不必为此显式特化整个 class,您可以只显式特化构造函数。)
您的意图显然完全不同:为 class 模板专业化中的构造函数提供定义
template<>
class solve<IPOPT>
{
...
正确的语法不应提及 template<>
solve<IPOPT>::solve(nlp* problem): m_ipopt(problem)
{
}