Возможная ошибка шаблона g ++?

Я столкнулся с некоторым кодом, который, как я думаю, должен компилировать, но не делает. Так что я надеюсь, что некоторые из местных экспертов по стандартам здесь, в 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.

12
задан Evan Teran 13 January 2011 в 07:27
поделиться