Рассмотрим следующий 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, например.
Попытка скомпилировать его с 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
Любая идея о том, что я делаю неправильно?
Заранее спасибо.
=== РЕДАКТИРОВАТЬ ===
Обходной я нашел объявить второй «квадрат() метод в качестве шаблона, а также:
template<int K2>
typename KClass<K2>::Data square();
Это хорошо работает, но это позволяет пользователь называть "aquare() передавая параметр шаблона, отличного от класса, например:
KClass<2> c;
c.square<3>;
, который дает«неопределенная ссылка на»связь ошибки.
=== EDIT (РАСТВОР) ===
Все права, решение было проще, чем я ожидал. Мне просто пришлось снять объявление шаблона:
template<>
inline KClass<2>::Data square();
, что не является необходимым.
VC++ 2010 компилирует это нормально – Yola