Объявление оператора == для вложенного шаблона класса

У меня есть следующий вложенный класс шаблона внутри другого класса шаблона:

template<typename T>
struct A
{
template<typename V>
struct B {};
};

Какой будет подпись не члена operator== для вложенного типа B? Следующая наивная попытка не работает:

template<typename T, typename V>
bool operator==(A<T>::B<V> left, A<T>::B<V> right);

Clang, GCC и MSVC выдают различные ошибки и / или подсказывают, что не так, например, отсутствует template Ключевое слово, но ни одна из моих попыток решить его не сработала.

Обратите внимание, что это, очевидно, работает:

template<typename T>
struct A
{
template<typename V>
struct B {};

template<typename V>
friend bool operator==(B<V> left, B<V> right)
{
return true;
}
};

Однако причина, по которой мне нужно внешнее объявление, не являющееся членом, заключается в том, чтобы задокументировать его с помощью qdoc. Qdoc использует clang для разбора источников и требует от меня предоставления декларации operator== что я на самом деле реализовал на месте, как только что показано.

LIVE DEMO

9

Решение

Вы можете иметь встроенную декларацию друга и определение схемы

template<typename T>
struct A
{
template<typename V>
struct B
{
friend bool operator==(B left, B right);
};
};

template <typename T, typename V>
bool operator==(typename A<T>::template B<V> left, typename A<T>::template B<V> right)
{
return true;
}

Однако GCC предупреждает

предупреждение: объявление друга bool operator==(A<T>::B<V>, A<T>::B<V>)
объявляет не шаблонную функцию [-Wnon-template-friend]

примечание: (если это не то, что вы хотели, убедитесь, что функция
шаблон уже объявлен и добавлен <> после функции
имя здесь)

И чтобы исправить это предупреждение, мы должны были бы operator==(B left, B right) до определения B, который может быть только внутри Aчто заставит его быть другом A также.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]