Я пытаюсь скомпилировать с помощью 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
G++ не нравится цепочка методов шаблона в шаблоне var? ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1732319568
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
Подробнее здесь: [url]https://stackoverflow.com/questions/1574721/g-doesnt-like-template-method-chaining-on-template-var[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия