by Anonymous » 17 Jan 2025, 09:34
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?
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]#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]
Leider funktioniert dies aufgrund eines unvollständigen Fehlers nicht:
[code]member access into incomplete type 'const S'
friend constexpr decltype(std::declval().bar()) ns::foo(S const &c);
^
[/code]
Wie kann ich erklären, dass ns::foo ein Freund meiner Klasse ist?