首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c++ partial specialization:如何将此template<class T1、T2>类专门化到此template<class T1>?

c++ partial specialization:如何将此template<class T1、T2>类专门化到此template<class T1>?
EN

Stack Overflow用户
提问于 2012-04-21 04:37:27
回答 2查看 688关注 0票数 3
代码语言:javascript
运行
复制
#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;
}

如何将我的双参数模板转换为单参数模板?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-21 04:45:39

模板专门化不能用来减少模板参数的数量,要做到这一点,你应该对一些参数使用默认值。

因此,为了只允许使用一个参数,并使该用法符合您的专门化要求,您需要为第二个参数设置一个默认值,它与第一个参数相同:

代码语言:javascript
运行
复制
#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;
}
票数 6
EN

Stack Overflow用户

发布于 2012-04-21 04:41:49

您可以对第二个实例化类型使用(合理的)默认值:

代码语言:javascript
运行
复制
template <class T1, typename T2 = void>
class A {
public:
    void taunt() { cout << "A"; }
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10253219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档