Как подружить шаблон функции внутри шаблона класса?C++

Программы на C++. Форум разработчиков
Anonymous
Как подружить шаблон функции внутри шаблона класса?

Сообщение Anonymous »

Мне кажется, что это дубликат, но при беглом поиске я его не вижу.
Вот в чем основная проблема. Я хочу сохранить конфиденциальность участника, но разрешить использование функции уровня пространства имен (без ADL):

Код: Выделить всё

#include 

namespace ns
{
template
decltype(std::declval().bar()) foo(T const &v) { return v.bar(); }
}

template
class S
{
void bar() const { }
public:
friend constexpr decltype(std::declval().bar()) ns::foo(S const &c);
};

int main()
{
ns::foo(S());
}
К сожалению, это не работает из-за ошибки неполного типа:

Код: Выделить всё

member access into incomplete type 'const S'
friend constexpr decltype(std::declval().bar()) ns::foo(S const &c);
^
Как я могу объявить, что ns::foo является другом моего класса?

Подробнее здесь: https://stackoverflow.com/questions/793 ... s-template

Вернуться в «C++»