частичная специализация шаблона внутри класса
От: innochenti  
Дата: 21.12.11 20:19
Оценка: 4 (1)
#include <iostream>
template<class U, int index>
struct Index
{
        template<class Z, int T> 
        struct Helper;
 
        template<class Z>
        struct Helper<Z,index>
        {
                static const int value = 1;
        };
 
        template<class Z, int T>
        struct Helper
        {
                static const int value = 0;
        };
 
        static const int value = Helper<U,1>::value;
};
 
int main()
{
Index<int,1> j;
std::cout << j.value << std::endl;
return 0;
}


в студии 2010 результат равен 0.
а в http://ideone.com/n1tXs
результат равен 1.

Объясните, пожалуйста, в чем подвох.
Re: частичная специализация шаблона внутри класса
От: Сыроежка  
Дата: 21.12.11 20:55
Оценка:
Здравствуйте, innochenti, Вы писали:

I>
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;
}
Меня можно встретить на www.cpp.forum24.ru
Re[2]: частичная специализация шаблона внутри класса
От: innochenti  
Дата: 21.12.11 21:03
Оценка:
Здравствуйте, Сыроежка

да, это я тоже заметил, но от того не легче.
Re: частичная специализация шаблона внутри класса
От: rg45 СССР  
Дата: 21.12.11 21:14
Оценка: 2 (1) +1
Здравствуйте, 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]: частичная специализация шаблона внутри класса
От: innochenti  
Дата: 21.12.11 21:16
Оценка:
Здравствуйте, 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]: частичная специализация шаблона внутри класса
От: rg45 СССР  
Дата: 21.12.11 21:17
Оценка:
Здравствуйте, 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]: частичная специализация шаблона внутри класса
От: rg45 СССР  
Дата: 21.12.11 21:40
Оценка:
Здравствуйте, 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]: частичная специализация шаблона внутри класса
От: night beast СССР  
Дата: 22.12.11 03:56
Оценка:
Здравствуйте, rg45, Вы писали:

I>>Объясните, пожалуйста, в чем подвох.


R>Очевидно, у студии рвет крышу именно от частичной специализации. Если частичную заменить на полную, то все становится на свои места:


емнип, то частичная специализация внутри классов была запрещена, и компиляторы поддерживали это как расширение.
хотя, в последнее время память стала подводить
Re[4]: частичная специализация шаблона внутри класса
От: NiJazz Австралия  
Дата: 30.12.11 14:15
Оценка:
Здравствуйте, rg45, Вы писали:

R>ИМХО, ошибочно поведение студии


Не вдавался в подробности, но gcc 4.2 (macosx) тоже дает 0.
И вообще, начиная с 2005-й студии, реализация С++ у MS вполне на уровне.
Re[5]: частичная специализация шаблона внутри класса
От: Alexey F  
Дата: 30.12.11 14:21
Оценка: 4 (1)
Здравствуйте, NiJazz, Вы писали:

NJ>Не вдавался в подробности, но gcc 4.2 (macosx) тоже дает 0.

GCC (mingw) 4.5.2, 4.6.1, 4.7.0 (20110617 (experimental)) выдали 1.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.