Добрый день.
У меня 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);
}
Здравствуйте, Аноним, Вы писали:
А>Добрый день.
А>У меня 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);
А>}
А>
скажите, пожалуйста, на какой строке ошибка ?
Здравствуйте, Аноним, Вы писали:
А>А>class B
А>{
А> template<typename T> static void Foo() { }
А>};
А> Type i = T2::Foo(); // должно работать в обеих
А>
Тип шаблонного параметра функции определяется автоматически по её параметрах.
Здравствуйте, s_anatoli, Вы писали:
_>Здравствуйте, Аноним, Вы писали:
А>>А>>class B
А>>{
А>> template<typename T> static void Foo() { }
А>>};
А>> Type i = T2::Foo(); // должно работать в обеих
А>>
_>Тип шаблонного параметра функции определяется автоматически по её параметрах.
Спасибо, но смысл в том, что в B::Foo нужен сам тип(собственно, ради этого конструкция и нужна), то есть я хотел бы его туда передать
Здравствуйте, Аноним, Вы писали:
А>>> 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));
Здравствуйте, 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));
_>
Еще раз спасибо!
Действительно, так собирается и работает.
Хотя не доконца понятно, почему он не работал в неисправленном варианте...
Здравствуйте, Аноним, Вы писали:
А>Добрый день.
А>У меня 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
Шахтер
Здравствуйте, Аноним, Вы писали:
А>Добрый день.
А>У меня 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);
А>}
А>
Здравствуйте, <Аноним>, Вы писали:
А>Добрый день.
А>У меня 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 >>