Разница между структурой и классом при шаблонном метапрограммировании - PullRequest
0 голосов
/ 30 марта 2012
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 };
};

Я использую g ++ для компиляции, и это жалуется ... однако, насколько я знаю, struct и class обрабатываются почти одинаково. Просто так "В C ++ единственное отличие между struct и классом состоит в том, что члены структуры являются открытыми по умолчанию, а члены класса являются закрытыми по умолчанию. "

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

Ответы [ 3 ]

3 голосов
/ 30 марта 2012

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

Справочную информацию о разнице между классом и структурой см. Каковы различия между структурой и классом в C ++ .

0 голосов
/ 30 марта 2012

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

0 голосов
/ 30 марта 2012

Конкретный класс 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. 
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...