G++ не нравится цепочка методов шаблона в шаблоне var?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 G++ не нравится цепочка методов шаблона в шаблоне var?

Сообщение Anonymous »

Я пытаюсь скомпилировать с помощью g++ некоторый код, ранее разработанный для Visual C++ 2008 Express Edition, и похоже, что g++ не позволяет мне вызвать метод шаблона по ссылке, возвращаемой методом переменной шаблона. Мне удалось сузить проблему до следующего кода:

class Inner
{
public:
template
T get() const
{
return static_cast(value_);
};
private:
int value_;
};

class Outer
{
public:
Inner const& get_inner() { return inner_; };
private:
Inner inner_;
};

template
int do_outer(T& val)
{
return val.get_inner().get();
}

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 относится к возврату val.get_inner().get();.

Если я сделаю do_outer обычным методом, получающим ссылку Outer, код компилируется. Превращение Inner::get() в обычный метод также работает. И заставить Inner::get() возвращать void и получать параметр шаблона также работает, потому что указанный ниже спецификатор int становится ненужным, т.е.:

class Inner
{
public:
template
void get(T& val) const
{
val = static_cast(value_);
};
private:
int value_;
};

...

template
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


Подробнее здесь: https://stackoverflow.com/questions/157 ... mplate-var
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»