Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: WFrag США  
Дата: 11.05.03 17:01
Оценка:
Есть код:
#include <iostream>

using namespace std;

template<template<int, int> class Comparer>
struct Test
{
    template<int T1, int T2>
    static void func( )
    {
        cout << Comparer<T1, T2>::result << endl;
    }
};


template<int T1, int T2>
struct Less
{
    enum { result = T1 < T2 };
};

struct Outer
{
    template<int T1, int T2>
    struct InternLess
    {
        enum { result = T1 < T2 };
    };
};

int main( )
{
    Test<Less>::func<30,20>( );              // OK
    Test<Outer::InternLess>::func<30,20>( ); // здесь падает с Internal Compiler Error
}


Есть идеи, как можно обойти ICE?
Компилятор — VC7.1, gcc 3.2.3 все вроде съедает без проблем...


Нужно это для такой кострукции:

template<template<class,class> class Comparer>
struct Negator
{
    template<class T1, class T2>
    struct Negated
    {
        enum { result = !Comparer<T1, T2>::result };
    };
};

// Имеем Comparer<class,class>, хотим !Comparer<class,class> 
DoSomeWithComparer<Comparer>::doSome( );
DoSomeWithComparer<Negator<Comparer>::Negated>::doSome( );



так же это помогло бы реализовать что-то вроде:
WH>
WH>template<class T>
WH>typedef SomeTemplate<Type1, T, Type2> SomeElseTemplate;
WH>

(http://www.rsdn.ru/forum/Message.aspx?mid=263155&amp;only=1
Автор: WolfHound
Дата: 09.05.03
)

таким образом:
template<class Type1, class Type2>
struct Bind13
{
    // Не совсем то же самое, что и выше, но в некоторых случаях поможет,
    // например, для передачи SomeTemplate в качестве параметра какому-нибудь шаблону
    // при зафиксированных 1 и 3 параметрах.
    template<class T>
    struct InternSomeElseTemplate : public SomeTemplate<Type1, T, Type2>
    { };
};
// И вместо SomeElseTemplate использовать MyBind::InternSomeElseTemplate,
// при typedef Bind13<Type1,Type2> MyBind;
7. О чем невозможно говорить, о том следует молчать.
Re: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: MaximE Великобритания  
Дата: 11.05.03 17:22
Оценка: 22 (3)
Здравствуйте, WFrag, Вы писали:

Удалось пофиксить так:

#include <iostream>

using namespace std;

template<template<int, int> class Comparer>
struct Test
{
    template<int T1, int T2>
    static void func( )
    {
        typedef Comparer<T1, T2> Fix;
        cout << Fix::result << endl;
    }
};


template<int T1, int T2>
struct Less
{
    enum { result = T1 < T2 };
};

struct Outer
{
    template<int T1, int T2>
    struct InternLess
    {
        enum { result = T1 < T2 };
    };
};

int main( )
{
    Test<Less>::template func<30,20>();
    Test<typename Outer::InternLess>::template func<30,20>();
}
Re: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: MaximE Великобритания  
Дата: 11.05.03 17:29
Оценка:
Здравствуйте, WFrag, Вы писали:

WF>Есть код:


[]

Вообще, что делаешь? Пока то, что ты пишешь похоже на то, что есть в boost::mpl.
Re: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: Sergeem Израиль  
Дата: 11.05.03 20:12
Оценка:
Здравствуйте, WFrag, Вы писали:

WF>Есть код:

WF>
WF>#include <iostream>

WF>using namespace std;

WF>template<template<int, int> class Comparer>
WF>struct Test
WF>{
WF>    template<int T1, int T2>
WF>    static void func( )
WF>    {
WF>        cout << Comparer<T1, T2>::result << endl;
WF>    }
WF>};

...

WF>


Может ему typename вперед Comparer<T1, T2>::result подсунуть?
Serge.

Hасколько проще была бы жизнь, если бы она была в исходниках.
Re[2]: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: WFrag США  
Дата: 12.05.03 00:23
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, WFrag, Вы писали:


WF>>Есть код:


ME>[]


ME>Вообще, что делаешь? Пока то, что ты пишешь похоже на то, что есть в boost::mpl.


Книжку читаю, тренируюсь
7. О чем невозможно говорить, о том следует молчать.
Re[2]: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: WFrag США  
Дата: 12.05.03 00:23
Оценка:
Здравствуйте, MaximE, Вы писали:

Спасибо! Пока что typedef спасает... Едем дальше...
7. О чем невозможно говорить, о том следует молчать.
Re[2]: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: MaximE Великобритания  
Дата: 12.05.03 05:18
Оценка:
Здравствуйте, Sergeem, Вы писали:

WF>>Есть код:

WF>>
WF>>#include <iostream>

WF>>using namespace std;

WF>>template<template<int, int> class Comparer>
WF>>struct Test
WF>>{
WF>>    template<int T1, int T2>
WF>>    static void func( )
WF>>    {
WF>>        cout << Comparer<T1, T2>::result << endl;
WF>>    }
WF>>};

S>...

WF>>


S>Может ему typename вперед Comparer<T1, T2>::result подсунуть?


Здесь typename был бы неуместен.
Re[2]: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: Sashko Россия http://www.dc.baika.ru/
Дата: 12.05.03 09:37
Оценка:
>
> int main( )
> {
>     Test<Less>::template func<30,20>();
>     Test<typename Outer::InternLess>::template func<30,20>();
> }
>


typename тут наверно лишний
Posted via RSDN NNTP Server 1.5 beta
Re[3]: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: MaximE Великобритания  
Дата: 12.05.03 11:33
Оценка:
Здравствуйте, Sashko, Вы писали:


>>
>> int main( )
>> {
>>     Test<Less>::template func<30,20>();
>>     Test<typename Outer::InternLess>::template func<30,20>();
>> }
>>


S>typename тут наверно лишний


Я тоже не особо уверен. Подсказал бы кто...
Re[4]: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: Lorenzo_LAMAS  
Дата: 12.05.03 12:51
Оценка: 8 (1)
Подсказываю. Тайпнэйм здесь не нужен.
Of course, the code must be complete enough to compile and link.
Re[5]: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: MaximE Великобритания  
Дата: 12.05.03 12:54
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

LL>Подсказываю. Тайпнэйм здесь не нужен.


Почему? Потому, что InternLess не argument dependent?
Re[6]: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: Lorenzo_LAMAS  
Дата: 12.05.03 13:11
Оценка:
ME>Почему? Потому, что InternLess не argument dependent?
Да. А вообще никак не поборю лень и не решу проблему с dependent names раз и навсегда (решается старательным чтением стандарта)
Of course, the code must be complete enough to compile and link.
Re[2]: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: Павел Кузнецов  
Дата: 12.05.03 17:10
Оценка:
Здравствуйте, MaximE, Вы писали:

M>
M> int main( )
M> {
M>     Test<Less>::template func<30,20>();
M>     Test<typename Outer::InternLess>::template func<30,20>();
M> }
M>


Должно быть так:

int main()
{
    Test<Less>::func<30,20>();
    Test<Outer::InternLess>::func<30,20>();
}


template и typename в данном виде употребляются только внутри шаблонов.
Posted via RSDN NNTP Server 1.5 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: MaximE Великобритания  
Дата: 12.05.03 21:13
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, MaximE, Вы писали:


M>
M> int main( )
M> {
M>     Test<Less>::template func<30,20>();
M>     Test<typename Outer::InternLess>::template func<30,20>();
M> }
M>


ПК>Должно быть так:


ПК>
ПК>int main()
ПК>{
ПК>    Test<Less>::func<30,20>();
ПК>    Test<Outer::InternLess>::func<30,20>();
ПК>}
ПК>


ПК>template и typename в данном виде употребляются только внутри шаблонов.


Возможно, я ошибаюсь, но template здесь применен правильно. Если нет, то почему?
Re[3]: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: MaximE Великобритания  
Дата: 12.05.03 21:26
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, MaximE, Вы писали:


M>>
M>> int main( )
M>> {
M>>     Test<Less>::template func<30,20>();
M>>     Test<typename Outer::InternLess>::template func<30,20>();
M>> }
M>>


ПК>Должно быть так:


ПК>
ПК>int main()
ПК>{
ПК>    Test<Less>::func<30,20>();
ПК>    Test<Outer::InternLess>::func<30,20>();
ПК>}
ПК>


ПК>template и typename в данном виде употребляются только внутри шаблонов.


Я не силен в цитировании святых писаний, но разве не так:

14.2 Names of template specializations

[4] When the name of a member template specialization appears after . or ­> in a postfix expression,
or after nested name specifier in a qualified id, and the postfix expression or qualified id explicitly depends on a template parameter (14.6.2), the member template name must be prefixed by the keyword template. Otherwise the name is assumed to name a nontemplate.

class X
{
public:
    template<size_t> X* alloc();
    template<size_t> static X* adjust();
};

template<class T> void f(T* p)
{
    T* p1 = p->alloc<200>(); // illformed: < means less than
    T* p2 = p->template alloc<200>(); // OK: < starts template argument list
    T::adjust<100>(); // illformed: < means less than
    T::template adjust<100>(); // OK: < starts explicit qualification
}

Re[4]: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: Павел Кузнецов  
Дата: 13.05.03 06:49
Оценка: 24 (1)
Здравствуйте, MaximE, Вы писали:

ПК>> template и typename в данном виде употребляются только внутри шаблонов.


M>

M> When <...> the postfix expression or qualified id explicitly
M> depends on a template parameter (14.6.2), the member template name
M> must be prefixed by the keyword template.


Обрати внимание на выделенное. Имена могут зависеть от параметра шаблона
только в определении последнего. template после зависимых имен
нужно именно для того, чтобы корректно компилировать определение шаблона.
Когда шаблон уже инстанциирован, что имеет место при обращении к любому
из его членов вне определения шаблона, никакой надобности в добавлении
префикса template нет: компилятор и без того знает, какие члены есть
в шаблоне, и какие из них, в свою очередь, являются шаблонами.
Posted via RSDN NNTP Server 1.5 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: Павел Кузнецов  
Дата: 13.05.03 06:55
Оценка:
Здравствуйте, MaximE, Вы писали:

M>>
M>> int main( )
M>> {
M>>     Test<Less>::template func<30,20>();
M>>     Test<typename Outer::InternLess>::template func<30,20>();
M>> }
M>>


ПК>> template и typename в данном виде употребляются только внутри шаблонов.


M> Возможно, я ошибаюсь, но template здесь применен правильно. Если нет, то почему?


template употребляется только для квалификации членов специализаций шаблонов,
заданных именами, зависимыми от параметров шаблона. В данном случае имена
Test<Less> и Test<Outer::InternLess> от параметров шаблона зависеть не могут,
т.к. main() шаблоном не является. Например, Comeau на приведенный код выдает ошибку.
Posted via RSDN NNTP Server 1.5 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: Вложенные шаблоны как параметры шаблона - VC7.1 (ICE)
От: MaximE Великобритания  
Дата: 13.05.03 08:32
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, MaximE, Вы писали:


ПК>>> template и typename в данном виде употребляются только внутри шаблонов.


M>>

M>> When <...> the postfix expression or qualified id explicitly
M>> depends on a template parameter (14.6.2), the member template name
M>> must be prefixed by the keyword template.


Какой я чайник. Мне так лень вчитываться в этот стандарт...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.