2013-05-02 99 views
2

考虑以下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”),并且该数据成员上执行一些计算的方法('广场()')。我想要做的是,例如,当K = 2时,为“square()”做一个专门化。

试图用4.6.7或4.7.2编译它提供了以下错误:

main.cpp:23:14: error: explicit specialization in non-namespace scope 'class KClass'

main.cpp:24:5: error: 'Data' in 'class KClass<2>' does not name a type

什么我做错了任何想法?

在此先感谢。

=== EDIT ===

我发现一种解决方法是声明第二“平方()”方法作为模板,以及:

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

它工作得很好,但它允许用户呼叫“aquare()”通过一个模板参数从类不同的,例如:

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

其给出“未定义参考”连接错误。

=== EDIT(液)===

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

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

,这是不必要的。

+0

VC++ 2010编译ok – Yola 2013-05-02 15:25:12

回答

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

而且你必须删除。这不是你如何专门化一个成员函数。成员函数不能专用于类范围中。它需要在类声明的周围名称空间内专用。

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

是的,我的错。但它只是解决了最后一行错误:“main.cpp:29:24:错误:'square'不是模板函数” – Monfico 2013-05-02 13:58:54

+0

@Monfico My fault。查看编辑。 – stardust 2013-05-02 14:01:12