gcc & templates
От: Аноним  
Дата: 23.11.04 15:49
Оценка:
Добрый день.
У меня g++, v3.4.2
следующий код не компилит, с ошибкой "error: expected primary-expression before '>' token"
скажите плз, в чем именно ошибка (на VS7.1 это работает)

struct A
{
    typedef int Type;
};
class B
{
    template<typename T> static void Foo() { }
};
template <class T1> class Cl
{
public:
    Cl() {};
    template<class T2> void Foo(T2 t)
    {
        typedef typename T1::Type Type;
        Type i = T2::Foo<Type>();//здесь
    }
};
int main()
{
    Cl<A> cl;
    B b;
    cl.Foo(b);
}
Re: gcc & templates
От: Аноним  
Дата: 23.11.04 15:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день.

А>У меня g++, v3.4.2
А>следующий код не компилит, с ошибкой "error: expected primary-expression before '>' token"
А>скажите плз, в чем именно ошибка (на VS7.1 это работает)
А>

А>struct A
А>{
А>    typedef int Type;
А>};
А>class B
А>{
А>    template<typename T> static void Foo() { }
А>};
А>template <class T1> class Cl
А>{
А>public:
А>    Cl() {};
А>    template<class T2> void Foo(T2 t)
А>    {
А>        typedef typename T1::Type Type;
А>        Type i = T2::Foo<Type>();//здесь
А>    }
А>};
А>int main()
А>{
А>    Cl<A> cl;
А>    B b;
А>    cl.Foo(b);
А>}
А>


скажите, пожалуйста, на какой строке ошибка ?
Re: gcc & templates
От: s_anatoli Украина http://koresha.org/sakhnik
Дата: 23.11.04 15:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>class B
А>{
А>    template<typename T> static void Foo() { }
А>};
А>        Type i = T2::Foo(); // должно работать в обеих
А>


Тип шаблонного параметра функции определяется автоматически по её параметрах.

Жизнь — это чудо! Только вперёд: sakhnik@jabber.kiev.ua
Re[2]: gcc & templates
От: Аноним  
Дата: 23.11.04 16:01
Оценка:
Здравствуйте, s_anatoli, Вы писали:

_>Здравствуйте, Аноним, Вы писали:


А>>
А>>class B
А>>{
А>>    template<typename T> static void Foo() { }
А>>};
А>>        Type i = T2::Foo(); // должно работать в обеих
А>>


_>Тип шаблонного параметра функции определяется автоматически по её параметрах.


Спасибо, но смысл в том, что в B::Foo нужен сам тип(собственно, ради этого конструкция и нужна), то есть я хотел бы его туда передать
Re[3]: gcc & templates
От: s_anatoli Украина http://koresha.org/sakhnik
Дата: 23.11.04 16:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>> template<typename T> static void Foo() { }


А>Спасибо, но смысл в том, что в B::Foo нужен сам тип(собственно, ради этого конструкция и нужна), то есть я хотел бы его туда передать


Можно пойти на хитрость, передав какой-нибудь игнорируемый параметр.
struct A
{
    template<typename T> void Foo(T* p);
};
A a;
a.Foo(reinterpret_cast<int*>(0)); // Тип явно определяется аргументом
a.Foo(reinterpret_cast<void*>(0));

Жизнь — это чудо! Только вперёд: sakhnik@jabber.kiev.ua
Re[4]: gcc & templates
От: Аноним  
Дата: 23.11.04 16:31
Оценка:
Здравствуйте, s_anatoli, Вы писали:

_>Здравствуйте, Аноним, Вы писали:


А>>>> template<typename T> static void Foo() { }


А>>Спасибо, но смысл в том, что в B::Foo нужен сам тип(собственно, ради этого конструкция и нужна), то есть я хотел бы его туда передать


_>Можно пойти на хитрость, передав какой-нибудь игнорируемый параметр.

_>
_>struct A
_>{
_>    template<typename T> void Foo(T* p);
_>};
_>A a;
_>a.Foo(reinterpret_cast<int*>(0)); // Тип явно определяется аргументом
_>a.Foo(reinterpret_cast<void*>(0));
_>


Еще раз спасибо!
Действительно, так собирается и работает.
Хотя не доконца понятно, почему он не работал в неисправленном варианте...
Re: gcc & templates
От: Аноним  
Дата: 23.11.04 17:03
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Добрый день.

А>У меня g++, v3.4.2
А>следующий код не компилит, с ошибкой "error: expected primary-expression before '>' token"
А>скажите плз, в чем именно ошибка (на VS7.1 это работает)
А>

А>struct A
А>{
А>    typedef int Type;
А>};
А>class B
А>{
А>    template<typename T> static void Foo() { }
А>};
А>template <class T1> class Cl
А>{
А>public:
А>    Cl() {};
А>    template<class T2> void Foo(T2 t)
А>    {
А>        typedef typename T1::Type Type;
А>        Type i = T2::Foo<Type>();//здесь
А>    }
А>};
А>int main()
А>{
А>    Cl<A> cl;
А>    B b;
А>    cl.Foo(b);
А>}
А>


T2::template Foo

Шахтер
Re: gcc & templates
От: 0xFADE США github.com/NotImplemented
Дата: 23.11.04 17:23
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Добрый день.

А>У меня g++, v3.4.2
А>следующий код не компилит, с ошибкой "error: expected primary-expression before '>' token"
А>скажите плз, в чем именно ошибка (на VS7.1 это работает)
А>

А>struct A
А>{
А>    typedef int Type;
А>};
А>class B
А>{
А>    template<typename T> static void Foo() { }
А>};
А>template <class T1> class Cl
А>{
А>public:
А>    Cl() {};
А>    template<class T2> void Foo(T2 t)
А>    {
А>        typedef typename T1::Type Type;
А>        Type i = T2::template Foo<Type>(); //!
А>    }
А>};
А>int main()
А>{
А>    Cl<A> cl;
А>    B b;
А>    cl.Foo(b);
А>}
А>
Re: gcc & templates
От: Шахтер Интернет  
Дата: 24.11.04 02:43
Оценка: 3 (1) +2
Здравствуйте, <Аноним>, Вы писали:

А>Добрый день.

А>У меня g++, v3.4.2
А>следующий код не компилит, с ошибкой "error: expected primary-expression before '>' token"
А>скажите плз, в чем именно ошибка (на VS7.1 это работает)
А>

А>struct A
А>{
А>    typedef int Type;
А>};
А>class B
А>{
А>    template<typename T> static void Foo() { }
А>};
А>template <class T1> class Cl
А>{
А>public:
А>    Cl() {};
А>    template<class T2> void Foo(T2 t)
А>    {
А>        typedef typename T1::Type Type;
А>        Type i = T2::Foo<Type>();//здесь
А>    }
А>};
А>int main()
А>{
    Cl<A>> cl;
А>    B b;
А>    cl.Foo(b);
А>}
А>


Добрался до дому.

Как компилятор режет данную строчку.

T2 -- имя типа. Неизвестного, потому что это шаблонный параметр.
T2::Foo -- имя из области T2. Однако, в классе могут быть определены имена разных классов. По умолчанию, компилятор считает, что T2::Fоо -- имя или статического члена, или метода класса T2.
Ну и, соответственно, разбирает выражение так

T2::Foo (примарное выражение)
< (знак операции меньше)
Type (здесь должно быть выражение, но вместо этого имеем тип -- ошибка парсинга)

Используя ключевое слово template можно явно указать компилятору, что T2::Foo -- имя шаблона, определённого в классе T2.

А> Type i = T2::template Foo<Type>();//здесь


После чего он разберет выражение правильно

T2::Foo (имя шаблона)
< (начало списка явно заданных аргументов шаблона)
Type (аргумент шаблона)
> (конец списка явно заданных аргументов шаблона)
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.