0

使用模板时是否允许以下​​操作。

template <typename PAR1 = X,
          typename PAR2 = Y,
          typename PAR3 = Z>
class Base {
   //some stuff inside
};

template <typename PAR1
          typename PAR2 = Z>
class Derived : public Base <PAR1,Y,PAR2> {
   //some stuff here
};

我在这里想要的是派生类应该始终将 PAR2 类型设为 Y。

当继承时其他参数为可选时,我们可以修复参数值吗?

4

2 回答 2

1

我猜您对模板默认值和部分专业化感到困惑。因为 Base 采用 3 个默认值参数,所以您可以使用 0 到 3 个参数实例化 Base。

Base<> b1;              #1, PAR1=X,   PAR2=Y,   PAR3=Z
Base<int> b2;           #2  Par1=int, PAR2=Y,   PAR3=Z
Base<int, int> b3;      #3  PAR1=int, PAR2=int, PAR3=Z
Base<int, int, int> b4; #4  PAR1=int, PAR2=int, PAR3=int 

#4在派生类中,您从当然有效的情况继承。

因此,您可以从上述任何形式的 Base 继承。

基本模板参数可以是独立的类型(值)或从template <typename PAR1, typename PAR2 = Y>

template <typename PAR1,
          typename PAR2 = Y>
class Derived : public Base <> {
};

或者

template <typename PAR1,
          typename PAR2 = Y>
class Derived : public Base <PAR1> {
};

或者

template <typename PAR1,
          typename PAR2 = Y>
class Derived : public Base <PAR1, PAR2> {
};
于 2013-01-24T06:27:26.897 回答
1

我希望你想要这样的东西。所以,有可能

class X{};
class Y{};
class Z{};

template <typename PAR1 = X,
          typename PAR2 = Y,
          typename PAR3 = Z>
class Base {
   //some stuff inside
};

template <typename PAR1, typename PAR3>
class Derived : public Base <PAR1,Y,PAR3> {
};

int main()
{
    Derived<X, Z> d;
}

编辑2:虽然与OP无关,但很高兴知道在部分专业化中,部分专业化类模板参数具有主模板的默认值

class X{};
class Y{};
class Z{};

template <typename PAR1 = X, typename PAR2 = Y, typename PAR3 = Z>
class Base {
public:
    void f() {
        std::cout << typeid(PAR1).name() << " " << typeid(PAR2).name() << " " << typeid(PAR3).name() << std::endl;
        std::cout << 1;
    }
};

template<typename PAR2, typename PAR3> class Base<X, PAR2, PAR3>
{
public:
    void f() {
        // PAR2 is by default Y and PAR3 is by default Z
        std::cout << typeid(PAR2).name() << " " << typeid(PAR3).name() << std::endl;
        std::cout << 2;
    }
};

int main()
{
    Base<X> b;   // instantiation of partially specialized template
    b.f();
}
于 2013-01-24T06:11:49.203 回答