思考C ++模板专业化

时间:2011-12-11 00:29:50

标签: c++ visual-studio-2010 templates generics stl

环境:Microsoft Visual Studio 2010

编码标准:兼容C ++ 0x

我有一个课程模板

template <typename T1, int I>
class A
{
    public template <typename T2> void f(T2 x);
    /*...*/
};

template <typename T1, int I>
template <typename T2>
void A<T1, I>::f(T2 x)
{
    /*...*/
}

以上类的部分专业化

template <int I>
class A<char, I>
{
    public template <typename T2> void f(T2 x);
    /*...*/
};

那么我可以在下面的部分专业类中专门化成员函数吗?

template <int I>
template <>
void A<char, I>::f<double>(double x)
{
}

谢谢!

注意:我不是在努力,而是在思考它是否适用。如果您了解规则,请轻松评分。

1 个答案:

答案 0 :(得分:1)

这是无效的,因为如果不向任何封闭的类模板提供固定模板参数,则无法显式地专门化成员函数。

不兼容C ++ 11,但使用MSVC

Microsoft编译器有一个扩展,允许在类模板中声明显式特化。即使我从未尝试过,但它很可能会接受以下非标准代码

template <int I>
class A<char, I>
{
    public:
    template <typename T2> void f(T2 x);

    template<> void f<double>(double x) {

    }
    /*...*/
};

更新:Clang编译并报告

// clang++ -fms-extensions main1.cpp
main1.cpp:10:21: warning: explicit specialization of 'f' within class scope is a
                 Microsoft extension [-Wmicrosoft]

  template<> void f<double>(double x) {
                  ^

兼容C ++ 11 / C ++ 03

这里的方式是重载而不是专业化

template <int I>
class A<char, I>
{
    public:
    template <typename T2> void f(T2 x);

    void f(double x) {

    }
    /*...*/
};