2016-10-09 4 views
0

ich die unten einfache Sache bin versucht, das Verhalten von ADLFehler Instanziieren Funktionsvorlage

namespace test{ 
    struct S{ public: s():a(10){} int a;}; 
    template<typename T> 
    void fun(S o){ 
     T a{}; 
     std::cout<<(a+o.a)<<"\n"; 
    } 
} 

int main(){ 
    test::S A; 
    fun<int>(A); 
} 
    error1: expected primary-expression before ‘int’ 
     fun<(int)>(A); 
    error2:'fun’ was not declared in this scope 
     fun<int>(A); 

Ich bin nicht sicher über den ersten Fehler zu trainieren (es hat nichts mit C++ ärgerlichen Parsing umgehen?) Und für die zweiter Fehler, da ich das Argument des Typs S übergeben habe Ich glaube, dass die ADL S und die damit verbundenen namespace test betrachten wird, aber nicht sicher, warum ich Fehler bekomme.

Antwort

-1

Sie haben Spaß <> im Test-Namespace platziert.

es also mit Test rufen :: Spaß

+2

Guter Versuch, aber ich denke, Sie den Punkt der Frage verfehlt. Es gibt eine Funktion in C++ namens ADL, die dies überflüssig machen würde, und die Frage ist, warum ADL im angegebenen Code nicht ausgelöst wird. –

+0

@Tomas Dittmann Ich bin dankbar für Ihre Antwort, aber ich bin über diese "ADL durch die Suche nach dem Namen in Namespaces und Klassen" mit den Typen der Aufrufargumente. Die genaue Definition dieser zugeordneten Namespaces und zugehörigen Klassen gegeben später, aber intuitiv können sie als alle Namespaces und Klassen gedacht werden, die ziemlich direkt mit einem bestimmten Typ verbunden sind. " –

+0

Ahh Ich habe noch nie von ADL gehört. Ich lese gerade darüber. Lernen durch falsche Antworten ... –

Verwandte Themen