考虑以下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();
,这是不必要的。
VC++ 2010编译ok – Yola 2013-05-02 15:25:12