c++ - 如何在部分特化模板类中实现全特化模板成员函数
问题描述
假设我有一个带有两个模板参数和一个模板成员函数的模板类 Foo。
我想在模板类为部分特化时进行成员函数特化,但以下代码编译失败由 g++
template <typename A, typename B>
class Foo
{
public:
template<typename C> void bar();
};
template<> template<typename T> inline void Foo<T, int>::bar<float>() {
}
int main()
{
Foo<double, int> foo;
foo.bar<float>();
return 0;
}
g++ 说:
错误:“<”之前的预期初始化程序 令牌
模板<> 模板内联 void Foo<T, int>::bar() {
我试过了
template<typename T> template<> inline void Foo<T, int>::bar<float>() {
和 g++ 抱怨更多
有可能吗?如何实现?
解决方案
当您专业化您的课程模板时,您将获得一个完全独立的专业化课程。因此,您必须使用其中的函数编写您的类 spezialisation foo
。
例子:
template <typename A, typename B>
class Foo
{
public:
template<typename C> void bar() { std::cout << "Generic" << std::endl;}
};
template <typename T>
class Foo<T,int>
{
public:
template<typename C> void bar(){ std::cout << "spezialized" << std::endl; }
};
int main()
{
Foo<double, int> foo;
foo.bar<float>();
Foo<double, char> foo2;
foo2.bar<int>();
return 0;
}
我相信你会尝试做一些不同的事情:-)
如果您只想在特定专业化中对成员进行专业化,而在非专业化情况下您希望查看类模板的通用功能,您可以这样做:
例子:
class Base
{
public:
template<typename C> void bar() { std::cout << "Generic" << std::endl;}
void other() { std::cout << "Other" << std::endl; }
};
template <typename A, typename B>
class Foo: public Base
{
};
template <typename T>
class Foo<T,int>: public Base
{
public:
template<typename C> void bar(){ std::cout << "spezialized" << std::endl; }
};
int main()
{
Foo<double, int> foo;
foo.bar<float>();
foo.other();
Foo<double, char> foo2;
foo2.bar<int>();
foo2.other();
return 0;
}
推荐阅读
- typescript - Intersection not merging enums for property
- vba - 用户输入编辑宏以调整 Excel 排序
- python - PyGame pygame.sprite.collide_mask 没有检测到碰撞?
- javascript - 带有scrollTop的动画div在滚动页面中丢失动画
- python - 将参数替换为语句
- json - JSON - WepAPI - 解析值时遇到意外字符
- r - Sparklyr:尝试使用外部变量作为索引访问存储在列中的向量的元素
- bootstrap-4 - Bootstrap 视频轮播不会自动付款
- java - 如何在 AndroidStudio 项目中添加和使用 AAR
- c# - 时间:2019-04-10 标签:c#musicbot pipe broken