I>#include <iostream>
I>template<class U, int index>
I>struct Index
I>{
I> template<class Z, int T>
I> struct Helper;
I> template<class Z>
I> struct Helper<Z,index>
I> {
I> static const int value = 1;
I> };
I> template<class Z, int T>
I> struct Helper
I> {
I> static const int value = 0;
I> };
I> static const int value = Helper<U,1>::value;
I>};
I>int main()
I>{
I>Index<int,1> j;
I>std::cout << j.value << std::endl;
I>return 0;
I>}
I>
I>в студии 2010 результат равен 0. I>а в http://ideone.com/n1tXs I>результат равен 1.
I>Объясните, пожалуйста, в чем подвох.
Я упростил ваш пример, убрав первый шаблонный параметр. И у меня в студии 2010 выводит 1, а не 0, если создавать объект как Index<1> i;. Ежели создавать объект как Index<2> i;, то выводит 0.
Вот упрощеннный вариант:
#include"stdafx.h"#include <iostream>
template <int x>
struct Index
{
template <int y>
struct Helper;
template <>
struct Helper<x>
{
static const int value = 1;
};
template <int y>
struct Helper
{
static const int value = 0;
};
static const int value = Helper<1>::value;
};
int _tmain(int argc, _TCHAR* argv[])
{
Index<1> i;
std::cout << "Index::i = " << i.value << std::endl;
}
Здравствуйте, innochenti, Вы писали:
I>... I>в студии 2010 результат равен 0. I>а в http://ideone.com/n1tXs I>результат равен 1.
I>Объясните, пожалуйста, в чем подвох.
Очевидно, у студии рвет крышу именно от частичной специализации. Если частичную заменить на полную, то все становится на свои места:
template<>
struct Helper<U,index>
{
static const int value = 1;
};
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: частичная специализация шаблона внутри класса
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, innochenti, Вы писали:
I>>... I>>в студии 2010 результат равен 0. I>>а в http://ideone.com/n1tXs I>>результат равен 1.
I>>Объясните, пожалуйста, в чем подвох.
R>Очевидно, у студии рвет крышу именно от частичной специализации. Если частичную заменить на полную, то все становится на свои места:
R>
R> template<>
R> struct Helper<U,index>
R> {
R> static const int value = 1;
R> };
R>
так мой код ошибочен?
Re[3]: частичная специализация шаблона внутри класса
Здравствуйте, innochenti, Вы писали:
I>>>... I>>>в студии 2010 результат равен 0. I>>>а в http://ideone.com/n1tXs I>>>результат равен 1.
I>>>Объясните, пожалуйста, в чем подвох.
R>>Очевидно, у студии рвет крышу именно от частичной специализации. Если частичную заменить на полную, то все становится на свои места:
R>>
R>> template<>
R>> struct Helper<U,index>
R>> {
R>> static const int value = 1;
R>> };
R>>
I>так мой код ошибочен?
ИМХО, ошибочно поведение студии
--
Справедливость выше закона. А человечность выше справедливости.
Re[3]: частичная специализация шаблона внутри класса
Здравствуйте, innochenti, Вы писали:
R>>Очевидно, у студии рвет крышу именно от частичной специализации. Если частичную заменить на полную, то все становится на свои места:
I>так мой код ошибочен?
Студии издавна глючат на вложенных шаблонах. Деталей уже даже не помню, только привычка выработалась не злоупотреблять вложенными шаблонами. Вот и в этом случае ошибку можно обойти, если вынести Helper за пределы Index. Правда, придется слегка усложнить Helper, добавив в него дополнительный параметр:
#include <iostream>
template<class Z, int A, int B>
struct Helper
{
static const int value = 0;
};
template<class Z, int A>
struct Helper<Z,A,A>
{
static const int value = 1;
};
template<class U, int index>
struct Index
{
static const int value = Helper<U,1,index>::value;
};
int main()
{
std::cout << Index<int,1>::value << std::endl;
}
--
Справедливость выше закона. А человечность выше справедливости.
Re[2]: частичная специализация шаблона внутри класса
Здравствуйте, rg45, Вы писали:
I>>Объясните, пожалуйста, в чем подвох.
R>Очевидно, у студии рвет крышу именно от частичной специализации. Если частичную заменить на полную, то все становится на свои места:
емнип, то частичная специализация внутри классов была запрещена, и компиляторы поддерживали это как расширение.
хотя, в последнее время память стала подводить
Re[4]: частичная специализация шаблона внутри класса
Здравствуйте, NiJazz, Вы писали:
NJ>Не вдавался в подробности, но gcc 4.2 (macosx) тоже дает 0.
GCC (mingw) 4.5.2, 4.6.1, 4.7.0 (20110617 (experimental)) выдали 1.