2012-03-30 3 views
0
template<int n> 
struct Numberim{ 
    enum{ value = Numberim<n-1>::value + n }; 
}; 

template<> 
struct Numberim<0>{ 
    enum{ value = 0 }; 
}; 

Это простой пример tmp, и все в порядке;Разница между структурой и классом при метапрограмме шаблона

template<int n> 
class Numberim{ 
    enum{ value = Numberim<n-1>::value + n }; 
}; 

template<> 
class Numberim<0>{ 
    enum{ value = 0 }; 
}; 

Я использую г ++ для компиляции, и он жалуется ... Но, насколько я знаю, структура и класс обрабатывается почти таким же, как это way.just "В C++, единственное различием между struct и class - это то, что члены структуры являются общедоступными по умолчанию, а члены класса по умолчанию являются закрытыми ».

Итак, какая разница между ними здесь, на земле?

+1

'он жалуется.'- как он жалуется? –

+0

Почему вы думаете, что есть разница? – josephthomas

+0

@Jesse g ++ говорит вот так: «Ошибка:« Numberim <22> :: <анонимный enum> Numberim <22> :: value 'is private ", ну ... Я думаю, что наивно задавать этот вопрос. Спасибо. –

ответ

3

Разница будет такой же, как и для класса class vs struct. Ваше «значение» будет общедоступным для вашего первого примера (используя struct) и private для вашего второго примера (используя класс).

Для справки о различии между классом и структурой см. What are the differences between struct and class in C++.

0

Категория бетона Numberim<1> не имеет отношения к конкретному классу Numberim<0>.

Таким образом, имея один класс относится к другим ’ сек определению value работ, когда value является public, что это за struct, но не тогда, когда value является private, что это за class.

Вы можете использовать механизм friend, или вы можете сделать value общественности, или вы можете, гораздо проще, это сделать:

template<int n> 
class Numberim{ 
    enum{ value = n*(n+1)/2 }; 
    // And whatever else you want in here. 
}; 
0

Разница по-прежнему то же самое, когда он пытается скомпилировать Numberim<n-1>::value с n=1 пытается использовать специализацию шаблона. Однако, поскольку value является private членом Numberim<0> (поскольку переменные-члены класса равны private), он дает ошибку компилятора.

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