2017-09-19 4 views
2

Mein Kollege definierte eine Reihe von Funktionen (die meiner Meinung nach freie Funktionen sein sollten) innerhalb einer statusfreien Klasse als statische Member-Funktionen.
Da diese Klasse definiert ist und Typen aus einem verschachtelten Namespace verwendet, möchte ich ADL verwenden, um weniger unbrauchbaren Code zu schreiben. Aber hat ihre Entscheidung nicht gerade den Zweck von ADL gebrochen?Machen Sie ADL mit statischen Elementfunktionen arbeiten

namespace nested_long_namespace_name 
{ 
    struct type {}; 
    struct interface { static void f(type) {} }; 
} 

int main() 
{ 
    nested_long_namespace_name::type value{}; 
    f(value);          // ERROR (ADL does not kick in) 
    interface::f(value);        // ERROR (ADL does not kick in) 
    nested_long_namespace_name::interface::f(value); // OK 
} 

Nun, meine Frage ist: Gibt es eine Abhilfe andere, dass f als freie Funktion im Namensraum nested_long_namespace_name definieren?

+8

Ihr Kollege hat unqualifiziertes Nachschlagen (von außerhalb der Klasse) unmöglich gemacht. Also ja, keine ADL. – StoryTeller

+0

Wenn die Länge des Namespaces ein Problem ist, verwenden Sie einen Namespace-Alias. – chris

+0

Sie könnten 'auto & f = nutzlos :: f;' verwenden, um 'f' in den Namespace-Bereich zu bringen, aber leider wird dies auch nicht über ADL gefunden. – wally

Antwort

6

Die Argument-abhängige Suche findet nur Deklarationen in namespaces deklariert, und passiert nur während unqualified lookup. ADL würde niemals auf interface::f(value) angewendet werden, aber es gilt für f(value). Aber der Name f wird nur unter dem Namespace nested_long_namespace_name gesucht - wir werden nicht weiter nach Klassen suchen, die in diesen zugeordneten Namespaces für statische Funktionen oder Datenmember mit dem Namen f deklariert sind.

Dies folgt dem typischen Namenssuche Modell - Sie haben eine using-Direktive einen Namespace in den Gültigkeitsbereich zu bringen, aber es gibt keine äquivalente statische Klasse in Rahmen zu bringen.

Also ja, interface::f kann nicht von ADL gefunden werden.

Verwandte Themen