У меня есть следующий вложенный класс шаблона внутри другого класса шаблона:
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==
что я на самом деле реализовал на месте, как только что показано.
Вы можете иметь встроенную декларацию друга и определение схемы
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
также.
Других решений пока нет …