Page 1 of 1

Wie kann ich eine Funktionsvorlage innerhalb einer Klassenvorlage anfreunden?

Posted: 17 Jan 2025, 09:34
by Anonymous
Ich habe das Gefühl, dass es sich hierbei um ein Duplikat handeln muss, aber ich sehe es bei einer oberflächlichen Suche nicht.
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());
}
Leider funktioniert dies aufgrund eines unvollständigen Fehlers nicht:

Code: Select all

member access into incomplete type 'const S'
friend constexpr decltype(std::declval().bar()) ns::foo(S const &c);
^
Wie kann ich erklären, dass ns::foo ein Freund meiner Klasse ist?