Nontype模板类成员专门化

时间:2013-05-02 13:51:55

标签: c++ templates template-specialization

考虑以下c ++代码:

template <int K>
struct KData
{
   float data[K];
};

template<int K>
class KClass
{
public:   
    typedef KData<K> Data;
    Data m_data;

    Data square()
    {
        Data result;
        for(int i = 0; i < K; ++i)
            result.data[i] = m_data.data[i] * m_data.data[i];
        return result;
    }

    // Specialization for K = 2
    template<>
    KClass<2>::Data square();
};

template<>
KClass<2>::Data KClass<2>::square()
{
   Data result;
   result.data[0] = m_data.data[0] * m_data.data[0];
   result.data[1] = m_data.data[1] * m_data.data[1];
   return result;
}

int main()
{
   KClass<2> c;
   c.m_data.data[0] = c.m_data.data[1] = 1.f;
   c.square();

   return 0;
}

它有一个'KCalss',它有一个模板数据成员('m_data')和一个对该数据成员执行一些计算的方法('square()')。我想要做的是例如在K = 2的情况下对'square()'进行专门化。

尝试使用4.6.7或4.7.2编译它会产生以下错误:

  

main.cpp:23:14:错误:非命名空间范围'class KClass'中的显式特化

     

main.cpp:24:5:错误:'类KClass&lt; 2&gt;'中的'数据'没有命名类型

知道我做错了什么?

提前致谢。

===编辑===

我找到的解决方法是将第二个'square()'方法声明为模板:

template<int K2>
typename KClass<K2>::Data square();

它运行良好,但它允许用户调用'aquare()'传递不同于类的模板参数,例如:

KClass<2> c;
c.square<3>;

给出了“未定义的引用”链接错误。

===编辑(解决方案)===

好的,解决方案比我想象的要简单。我只需删除模板声明:

template<>
inline KClass<2>::Data square();

,这是不必要的。

1 个答案:

答案 0 :(得分:1)

template<>
KClass<2>::Data KClass<2>::square()
                ^^^^^^^^
{

你必须删除它。这不是您如何专门化成员函数。成员函数不能专门用于类范围。它需要专门用于类声明的周围命名空间。

 template<>
 KClass<2>::Data square();