如何在部分专业化模板类中实现完全专业化模板成员函数
How to implement full specialization templates member function within partial specialization templates class
假设我有一个模板类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++表示:
错误:"<"之前应为初始值设定项代币
模板<gt;模板内联空隙Foo<T、 int>:bar(({
我试过
template<typename T> template<> inline void Foo<T, int>::bar<float>() {
g++抱怨更多
这可能吗?如何实现?
[温度解释规范]/17:
在命名空间范围中出现的类模板或成员模板的成员的显式专用化声明中,该成员模板及其某些封闭类模板可能保持非专用化,但如果其封闭类模板也未显式专用,则声明不应显式专门化类成员模板在这样一个明确的专业化声明中,应该提供关键字模板,然后是模板参数列表,而不是模板<gt;在成员的显式专用化声明之前。模板参数列表中模板参数的类型应与主模板定义中规定的类型相同。
在类模板的成员或命名空间范围中出现的成员模板的显式专用化声明中,成员模板及其一些封闭类模板可能保持非专用化,除了如果类成员模板的封闭类模板也没有显式专用化,那么声明就不应该显式专门化该类成员模板
为您的代码:
template<typename A, typename B>
class Foo{
public:
template<typename C> void bar();
};
template<typename T> // for `Foo`
template<> // for `bar`
inline void Foo<T, int>::bar<float>(){}
int main(){
Foo<double, int> foo;
foo.bar<float>();
return 0;
}
因为CCD_ 1是显式专用的,而CCD_ 2是NOT。
当您专门化您的类模板时,您将获得一个完全独立的类来进行专门化。因此,您必须编写带有函数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;
}
相关文章:
- 如果没有malloc,链表实现将失败
- 如何使用默认参数等选择模板专业化
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 模板化建造师专业化
- 使用简单类型列表实现的指数编译时间.为什么
- 类模板的成员功能的定义在单独的TU中完全专业化
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 如何在部分类模板专业化中实现继承
- c++中两种形式的专业化模板实现之间的区别是什么
- 类模板专业化可以利用非专业化实现吗
- 模板专业化实现
- 如何实现这样的模板专业化