g ++ не нравится цепочка методов шаблона в шаблоне var?
Я пытаюсь скомпилироватьг ++ некоторый код, ранее разработанный подVisual C ++ 2008 Express Editionи, похоже, g ++ не позволит мне вызвать метод шаблона для ссылки, возвращаемой методом переменной шаблона. Я смог сузить проблему до следующего кода:
class Inner
{
public:
template<typename T>
T get() const
{
return static_cast<T>(value_);
};
private:
int value_;
};
class Outer
{
public:
Inner const& get_inner() { return inner_; };
private:
Inner inner_;
};
template<typename T>
int do_outer(T& val)
{
return val.get_inner().get<int>();
}
int main()
{
Outer outer;
do_outer(outer);
return 0;
}
Код прекрасно компилируется под компилятором Microsoft, но g ++ выдает ошибку:
$ g++ -c main.cpp
main.cpp: In function ‘int do_outer(T&)’:
main.cpp:24: error: expected primary-expression before ‘int’
main.cpp:24: error: expected ‘;’ before ‘int’
main.cpp:24: error: expected unqualified-id before ‘>’ token
где строка 24 относится кreturn val.get_inner().get<int>();
.
Если я сделаюdo_outer
нормальный метод полученияOuter
ссылка на код компилируется. ИзготовлениеInner::get()
нормальный метод также работает. И делаяInner::get()
возврат void и получение параметра шаблона также работает, потому чтоИНТ спецификатор ниже становится ненужным, т.е.
class Inner
{
public:
template<typename T>
void get(T& val) const
{
val = static_cast<T>(value_);
};
private:
int value_;
};
...
template<typename T>
int do_outer(T& val)
{
int i;
val.get_inner().get(i);
return i;
}
...
(G ++ не жалуется на код выше.)
Теперь у меня нет идей. В чем проблема? Есть ли проблема с gcc / g ++? Есть ли проблема с моим кодом?
Я использую компилятор:
$ g++ --version
g++ (Ubuntu 4.3.3-5ubuntu4) 4.3.3