c++ 模板特殊化问题

timond 2014-03-17 10:21:21
在c++特殊化的时候遇到的问题下面的这个代码是可以编译通过的但是不太理解,这个是用的c++什么特性?
template<bool B>
class A{
public:
void fun()
{
cout<<"Base Test"<<endl;
}
};

template<>
void A<true>::fun()
{
cout<<"Special Test"<<endl;
}


为什么下面的这个代码却编译不过呢?
template<typename T, bool B>
class A{
public:
void fun()
{
cout<<"Base Test"<<endl;
}
};

template<typename T>
void A<T,true>::fun()
{
cout<<"Special Test"<<endl;
}
...全文
162 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
timond 2014-03-17
  • 打赏
  • 举报
回复
引用 10 楼 akirya 的回复:
[quote=引用 8 楼 timond 的回复:] [quote=引用 7 楼 akirya 的回复:]
template<typename T>
class A<T,true>
{
public:
    void fun()
    {
        cout << "Special Test" << endl;
    }
};
这样我知道可以的 但是为什么不能局部特殊化呢?[/quote] 函数不支持.[/quote] 知道了 谢谢你 哪里有这方面的资料
  • 打赏
  • 举报
回复
引用 8 楼 timond 的回复:
[quote=引用 7 楼 akirya 的回复:]
template<typename T>
class A<T,true>
{
public:
    void fun()
    {
        cout << "Special Test" << endl;
    }
};
这样我知道可以的 但是为什么不能局部特殊化呢?[/quote] 函数不支持.
timond 2014-03-17
  • 打赏
  • 举报
回复
引用 8 楼 timond 的回复:
[quote=引用 7 楼 akirya 的回复:]
template<typename T>
class A<T,true>
{
public:
    void fun()
    {
        cout << "Special Test" << endl;
    }
};
这样我知道可以的 但是为什么不能局部特殊化呢?[/quote] 就是不写类名 直接写特化的函数 为什么不可以呢
timond 2014-03-17
  • 打赏
  • 举报
回复
引用 7 楼 akirya 的回复:
template<typename T>
class A<T,true>
{
public:
    void fun()
    {
        cout << "Special Test" << endl;
    }
};
这样我知道可以的 但是为什么不能局部特殊化呢?
  • 打赏
  • 举报
回复
template<typename T>
class A<T,true>
{
public:
    void fun()
    {
        cout << "Special Test" << endl;
    }
};
AndyStevens 2014-03-17
  • 打赏
  • 举报
回复
引用 5 楼 Automation_dmu 的回复:
这个template<> 表示全局成员特化,C++规定:类模板的成员函数和普通静态成员变量可以被全局特化,实现这种特化的语法要求给每个外围类模板加上template<> 。
§ 14.7 3. An explicit specialization may be declared for a function template, a class template, a member of a class template or a member template. An explicit specialization declaration is introduced by template<>. In an explicit specialization declaration for a class template, a member of a class template or a class member template, the name of the class that is explicitly specialized shall be a simple-template-id. In the explicit specialization declaration for a function template or a member function template, the name of the function or member function explicitly specialized may be a template-id.
AndyStevens 2014-03-17
  • 打赏
  • 举报
回复
这个template<> 表示全局成员特化,C++规定:类模板的成员函数和普通静态成员变量可以被全局特化,实现这种特化的语法要求给每个外围类模板加上template<> 。
timond 2014-03-17
  • 打赏
  • 举报
回复
引用 1 楼 feihuadao 的回复:
两个看起来都是非类型形参的实例化,不是特化。 模板特化只针对类型,第二个走特化的路子,搞错了对象。 个人理解。
这个不是局部模板特殊化么?
timond 2014-03-17
  • 打赏
  • 举报
回复
引用 2 楼 sduxiaoxiang 的回复:
没有这么写的吧A<T,true> 第一个bool除了false就是true,还不如直接写两个类算了
我选的比较特殊化 bool 如果是这样呢 template <class elemType, int size> class Buffer { ... }; // 类模板 Buffer 的局部特殊化 template <class elemType> class Buffer<elemType,1024> { };
sduxiaoxiang 2014-03-17
  • 打赏
  • 举报
回复
没有这么写的吧A<T,true> 第一个bool除了false就是true,还不如直接写两个类算了
feihuadao 2014-03-17
  • 打赏
  • 举报
回复
两个看起来都是非类型形参的实例化,不是特化。 模板特化只针对类型,第二个走特化的路子,搞错了对象。 个人理解。
ri_aje 2014-03-17
  • 打赏
  • 举报
回复
引用 14 楼 timond 的回复:
[quote=引用 13 楼 ri_aje 的回复:] 标准规定的,特化模板类成员函数必须特化模板类本身才行,只偏特化不行。
你是说模板类 还是类模板?[/quote] 说的是类模板,class template。不存在模板类,刚才用词错了。
timond 2014-03-17
  • 打赏
  • 举报
回复
引用 10 楼 akirya 的回复:
[quote=引用 8 楼 timond 的回复:] [quote=引用 7 楼 akirya 的回复:]
template<typename T>
class A<T,true>
{
public:
    void fun()
    {
        cout << "Special Test" << endl;
    }
};
这样我知道可以的 但是为什么不能局部特殊化呢?[/quote] 函数不支持.[/quote] 为什么第一种方法支持呢, 第一种是不是局部特化?
timond 2014-03-17
  • 打赏
  • 举报
回复
引用 13 楼 ri_aje 的回复:
标准规定的,特化模板类成员函数必须特化模板类本身才行,只偏特化不行。
你是说模板类 还是类模板?
ri_aje 2014-03-17
  • 打赏
  • 举报
回复
标准规定的,特化模板类成员函数必须特化模板类本身才行,只偏特化不行。
feihuadao 2014-03-17
  • 打赏
  • 举报
回复
引用 4 楼 timond 的回复:
[quote=引用 1 楼 feihuadao 的回复:] 两个看起来都是非类型形参的实例化,不是特化。 模板特化只针对类型,第二个走特化的路子,搞错了对象。 个人理解。
这个不是局部模板特殊化么?[/quote] 汗一个,看到7楼明白了。第一个是全特化,类,成员函数,一般函数都支持全特化, 第二个是偏特化,只有类支持偏特化。

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧