3

我有一个

template <int N> class Base

class Derived : public Base<1>

...有没有办法int N从 a 的定义中访问Derived::myMethod()(而不是得到编译器错误“使用未声明的标识符'N'”)?

更准确地说,我想做

void Derived::myMethod() {
   for (int n=0; n<N; n++) { ...
4

3 回答 3

5

模板参数具有模板的范围,但您可以在模板中定义一个可供派生类使用的嵌套常量:

template <int N> class Base {
public: // or protected:
   static const int theN = N;
};
于 2012-08-08T20:58:35.777 回答
1

另一种选择是您可以模板派生类:

template <int N>
class Derived : public Base<N>
{
    void myMethod()
    {
        for (int i = 0; i < N; ++i)
        //
    }
};
于 2012-08-08T21:22:31.320 回答
0

这就是我上面评论的意思:

class Base{
  public:
     Base(int value = 1) : value_(value){}  //don't need to use default param but can
  private:
     int value_
}

class Derived : public Base
{}

为什么要模板化 N?你需要专攻整个班级吗?另一种方法是“虚拟化”根据您设置为“专业化”的标准从模板调用的非成员函数。

编辑:模板类中方法的部分特化

于 2012-08-08T21:34:16.137 回答