考虑以下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();
,这是不必要的。
答案 0 :(得分:1)
template<>
KClass<2>::Data KClass<2>::square()
^^^^^^^^
{
你必须删除它。这不是您如何专门化成员函数。成员函数不能专门用于类范围。它需要专门用于类声明的周围命名空间。
template<>
KClass<2>::Data square();