Привет, ребята. Я портирую некоторый код из проекта, в основном разработанного в MSVS, на использование g ++. Я обнаружил много небольших различий, в основном то, что MSVS позволяет, а g ++ - нет. Обычно это что-то, связанное со стандартами c ++, вещи, которые MSVS позволяет скользить, но мне трудно понять, что не так с одним конкретным разделом.
g ++ испытывает проблемы при сопоставлении вызова оператора! =, Но только в определенном контексте. Поиск оператора! = Для определенного вложенного класса работает, если класс хостинга не является шаблоном. Если я превращу хостинг-класс в шаблон класса, все сломается. Я либо пропускаю что-то фундаментальное для c ++, либо g ++ делает что-то не так.
Я научился не плакать "Ошибка компилятора!" слишком часто, поэтому я хотел посмотреть, сможет ли кто-нибудь здесь увидеть, чего мне не хватает.
Этот работающий пример показывает рабочую версию без шаблона, а затем сломанную версию шаблона.
g ++ - версия дает: g ++ (Ubuntu 4.4.1-4ubuntu9) 4.4.1
Рабочая справочная версия без шаблонов
namespace Works {
struct host {
struct iterator {};
iterator op();
};
bool operator != (host::iterator const& a0, host::iterator const& a1);
bool f() {
return host().op() != host().op();
}
} // namespace Works
Разбитая версия с шаблонами
namespace Broken {
template <typename T>
struct host {
struct iterator {};
iterator op();
};
template <typename T>
bool operator != (typename host<T>::iterator const& a0,
typename host<T>::iterator const& a1);
bool f() {
return host<int>().op() != host<int>().op();
}
} // namespace Broken
Версия шаблона не работает с ошибками:
Main.cpp: In function ‘bool Broken::f()’:
Main.cpp:50: error: no match for ‘operator!=’ in ‘Broken::host<int>().Broken::host<T>::op [with T = int]() != Broken::host<int>().Broken::host<T>::op [with T = int]()’