如何在部分专业化模板类中实现完全专业化模板成员函数

  • 本文关键字:专业化 实现 成员 函数 c++ templates
  • 更新时间 :
  • 英文 :


假设我有一个模板类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;
}

最新更新