c ++ partial specialization:我怎样专门化这个模板< class T1,class T2>到此模板< class T1&gt ;? [英] c++ partial specialization: How can I specialize this template<class T1, class T2> to this template<class T1>?

查看:146
本文介绍了c ++ partial specialization:我怎样专门化这个模板< class T1,class T2>到此模板< class T1&gt ;?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  #include< iostream> 
using namespace std;

template< class T1,class T2>
class A {
public:
void taunt(){cout< 一个; }
};

template< class T1>
class A< T1,T1> {
public:
void taunt(){cout< B; }
};

class B {};

class C {};

int main(int argc,char * const argv []){

A&一个;

return 0;
}

如何将我的两个参数模板转换为一个参数模板? p>

上面的代码将给出一个编译器错误'A a;'为'错误的模板参数数'。

解决方案

模板专用化不能用于减少模板参数的数量,为此您应该为某些参数使用默认值。



因此,为了只允许使用一个参数,并且使用这个特性,你需要一个默认的第二个参数,它与第一个参数相同:

  #include< iostream> 
using namespace std;

template< class T1,class T2 = T1>
class A {
public:
void taunt(){cout< 一个; }
};

template< class T1>
class A< T1,T1> {
public:
void taunt(){cout< B; }
};

class B {};

class C {};

int main(int argc,char * const argv []){

A&一个;
a.taunt(); // PrintsB

return 0;
}


#include <iostream>
using namespace std;

template <class T1, class T2>
class A {
public:
    void taunt() { cout << "A"; }
};

template <class T1>
class A<T1, T1> {
public:
    void taunt() { cout << "B"; }
};

class B {};

class C {};

int main (int argc, char * const argv[]) {

    A<B> a;

    return 0;
}

How can I convert my two parameter template to a one parameter template?

The above code will give a compiler error on 'A a;' for 'wrong number of template arguments'.

解决方案

Template specialization can't be used to reduce the number of template arguments, to do that you should use defaults for some of the arguments.

So in order to allow usage of only one argument, and make that usage hit your specialization, you need a default for the second argument, which is the same as the first argument:

#include <iostream>
using namespace std;

template <class T1, class T2=T1>
class A {
public:
    void taunt() { cout << "A"; }
};

template <class T1>
class A<T1, T1> {
public:
    void taunt() { cout << "B"; }
};

class B {};

class C {};

int main (int argc, char * const argv[]) {

    A<B> a;
    a.taunt(); // Prints "B"

    return 0;
}

这篇关于c ++ partial specialization:我怎样专门化这个模板&lt; class T1,class T2&gt;到此模板&lt; class T1&gt ;?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆