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

Ответы на вопрос(3)

Ваш ответ на вопрос