Я столкнулся с некоторым кодом, который, как я думаю, должен компилировать, но не делает. Так что я надеюсь, что некоторые из местных экспертов по стандартам здесь, в 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'
Что кажется странным, потому что я четко (я думаю) определяю шаблонный оператор ==
, который должен охватывать это, на самом деле, если я просто сделаю небольшую работу для компилятора (включу USE_FIX), я больше не получу сообщение об ошибке. К сожалению, «исправление» не работает в общем случае, только для определенного экземпляра шаблона.
Это должно работать так, как я ожидал? Или это просто запрещено?
Кстати: если это важно, я использую gcc 4.5.2.