2013-05-02 3 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») и метод, который выполняет некоторые вычисления по этому элементу данных ('квадрат()'). Я хочу сделать специализацию «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(); 

, что не является необходимым.

+0

VC++ 2010 компилирует это нормально – Yola

ответ

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

И вы должны удалить это. Это не так, как вы специализируетесь на функции-члене. Функция-член не может быть специализирована в области видимости класса. Он должен быть специализированным в окружающем пространстве имен декларации класса.

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

Да, моя вина. Но он просто решает последнюю строку ошибки: «main.cpp: 29: 24: error:« square »не является функцией шаблона» – Monfico

+0

@Monfico Моя ошибка. См. Редактирование. – stardust

Смежные вопросы