Я столкнулся с кодом, который я думаю должен скомпилировать, но это не так.Поэтому я надеюсь, что некоторые местные эксперты по стандартизации здесь, в SO, могут помочь: -).
У меня есть некоторый код, похожий на этот:
#include <iostream>
template <class T = int>
class A {
public:
class U {
};
public:
U f() const { return U(); }
};
// test either the work around or the code I want...
#ifndef USE_FIX
template <class T>
bool operator==(const typename A<T>::U &x, int y) {
return true;
}
#else
typedef A<int> AI;
bool operator==(const AI::U &x, int y) {
return true;
}
#endif
int main() {
A<int> a;
std::cout << (a.f() == 1) << std::endl;
}
Итак, для описания того, чтоздесь происходитУ меня есть шаблон класса (A
), который имеет внутренний класс (U
) и, по крайней мере, одну функцию-член, которая может возвращать экземпляр этого внутреннего класса (f()
).
Тогда япопытка создать функцию operator==
, которая сравнивает этот внутренний тип с каким-либо другим типом (в данном случае int
, но это, похоже, не имеет значения).
Когда USE_FIX
равен не определено Я получаю следующую ошибку:
test.cc: In function 'int main()':
test.cc:27:25: error: no match for 'operator==' in 'a.A<T>::f [with T = int]() == 1'
Что кажется странным, потому что я явно (я думаю) определяю шаблонное operator==
, которое должно охватывать это, на самом деле, если я просто сделаюнемного работы для компилятора (включите USE_FIX), тогда я больше не получаю ошибку.К сожалению, «исправление» не работает вообще, только для конкретного экземпляра шаблона.
Должно ли это работать, как я ожидал?Или это просто не разрешено?
Кстати: если это имеет значение, я использую gcc 4.5.2.