'controlled_runge_kutta'不是类模板

时间:2015-02-06 11:07:53

标签: c++ templates boost odeint

以下代码中存在已知错误:

  

'controlled_runge_kutta'不是类模板

在以下代码中:

template<
class ErrorStepper ,
class ErrorChecker ,
class Resizer
>
class controlled_runge_kutta< ErrorStepper , ErrorChecker , Resizer , explicit_error_stepper_tag >
{
public:
};

int main()
{
    return 0;
}

我知道为什么会收到此错误。但我的问题是它在第146行github的原始boost库中是如何工作的?

谢谢。

2 个答案:

答案 0 :(得分:1)

看第109行。

template<
class ErrorStepper ,
class ErrorChecker = default_error_checker< typename ErrorStepper::value_type ,
typename ErrorStepper::algebra_type ,
typename ErrorStepper::operations_type > ,
class Resizer = typename ErrorStepper::resizer_type ,
class ErrorStepperCategory = typename ErrorStepper::stepper_category
>
class controlled_runge_kutta;

现在,有模板类的声明,在第146行中只有该类的部分特化。

答案 1 :(得分:0)

如果语法为:

template <template-parameters...> class NAME { ... };

然后它是“主模板定义”。如果是:

template <template-parameters...> class NAME<parameter-spec> { ... };

然后它是一个部分模板特化(一个辅助定义,为特殊情况的参数定义“映射”。

如果尚未提供该名称(类或函数模板)的主模板定义,则无法声明部分模板特化。

所以,取决于你想宣布的内容。如果只是一个模板 - 然后删除&lt; ...&gt;中的所有内容在班级名称之后。如果是专业化,那么请先定义模板本身。

template<...>语句在主定义和专门化中的含义并不相同。在主定义中,它定义了“签名”(应该如何调用“实例化”),在专门化中它只是提供一些在内部使用的名称。