Hier liegt im Grunde das Problem. Ich möchte ein Mitglied privat halten, aber die Verwendung der Funktion auf Namespace-Ebene (ohne ADL) zulassen:
Code: Select all
#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());
}
Code: Select all
member access into incomplete type 'const S'
friend constexpr decltype(std::declval().bar()) ns::foo(S const &c);
^