Вот в чем основная проблема. Я хочу сохранить конфиденциальность участника, но разрешить использование функции уровня пространства имен (без 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);
^
Подробнее здесь: https://stackoverflow.com/questions/793 ... s-template