[c++] вопрос про шаблоны функций-членов?

Landstreicher

Должен ли компилироваться следующий пример? Почему?

class X
{
public:
template <typename T> size_t g { return sizeof(T); }
};

template <typename T> class A
{
public:
X x;
X& getx { return x; }
void f { getx.g<T> }
};

int main
{
A<int> a;
a.f;
}
У меня наблюдаются такие результаты:

[lorien ~]$ g++ -v 2>&1|grep 'gcc version'
gcc version 3.3.5 (Debian 1:3.3.5-8)
[lorien ~]$ g++ 1.cpp
1.cpp: In member function `void A<T>::f':
1.cpp:14: error: parse error before `;' token
[lorien opentss]$ g++-3.4 -v 2>&1|grep 'gcc version'
gcc version 3.4.4 20050203 (prerelease) (Debian 3.4.3-9)
[lorien ~]$ g++-3.4 1.cpp
1.cpp: In member function `void A<T>::f':
1.cpp:14: error: expected primary-expression before '>' token
1.cpp:14: error: expected primary-expression before ')' token
[lorien ~]$ /usr/lib/gcc-snapshot/bin/g++ -v 2>&1|grep 'gcc version'
gcc version 4.0.0 20050212 (experimental)
[lorien ~]$ /usr/lib/gcc-snapshot/bin/g++ 1.cpp
1.cpp: In member function 'void A<T>::f':
1.cpp:14: error: expected primary-expression before '>' token
1.cpp:14: error: expected primary-expression before ')' token
[lorien ~]$ /opt/intel_cc_80/bin/icpc --version
8.1
[lorien ~]$ /opt/intel_cc_80/bin/icpc 1.cpp
[lorien ~]$

Dasar

Вроде, если функция шаблонная, то один из аргументов функции должен иметь тип шаблона

Landstreicher

интересно...
если заменить getx.g<T> на x.g<T> то начинает компилироваться - вроде ведь то же самое

Landstreicher

Вопрос решен. Надо писать: getx.template g<T>

freezer

я бы сделал так:

template<class T>
struct X
{
static size_t g {return sizeof(T);}
};

void F
{
cout << X<T>::g << endl;
}

rosali

А в стандарте что говорят? Залей в g++-ную bugzilla-у, пусть разбираются
Оставить комментарий
Имя или ник:
Комментарий: