template member function - typ parameter explicit angeben, wie?



  • class Test {
    
      template<class A, class B>
      B my_member_test (A a) {
        ... // do something fancy
      } 
    
    }
    
    ...
    
    Test t;
    bool t = true;
    
    int x = t.my_member_test(t); // Error
    int x = t.my_member_test<int, bool> (t); // Error
    

    Also wie kann ich my_member_test richtig aufrufen?

    Vielen dank!



  • t gibts zweimal... und schau mal an wierum A und B sind 😉



  • Sorry, nochmal das Beispiel:

    class Test {
    
      template<class A, class B>
      B my_member_test (A a) {
        ... // do something fancy
      }
    
    }
    
    ...
    
    Test t;
    bool b = true;
    
    bool x = t.my_member_test(b); // Error
    bool x = t.my_member_test<bool, bool> (b); // Error
    

    Gibt trotzdem Fehler: Im ersten Fall wird die Methode nicht gefunden (ist klar, template arguments können nicht automatisch abgeleitet werden), im zweiten Fall wird der Syntax abgewiesen ("error: expected primary-expression before ‘(’ token
    "). Frage: Wie schreibe ich es korrekt?



  • Die zweite Variante sollte aber funktionieren. Gib mal eine komplettes Beispiel was theoretisch compilieren sollte.
    Und welchen Compiler benutzt du?



  • Der erste Typ kann vom Compiler nicht erkannt werden, der zweite aber schon. Probiers mal mit einem Template-Parameter beim Aufruf.



  • ok, version 2 kompiliert tatsächlich ... 🙄

    Das Problem bis mir ist vielmehr, das der Aufruf wiederum in einer template-klasse erfolgt. Also so:

    class Test {
    
      template<class A, class B>
      B my_member_test (A a) {
        ... // do something fancy
      }
    
    }
    
    template<class C>
    class FancyTest {
    
       bool test_it(C c) {
         return c.my_member_test<bool, bool> (true);
       }
    
    }
    
    Test t;
    FancyTest ft;
    
    ft.test_it(t);
    

    // error: expected primary-expression before ‘(’ token -- Line 14



  • return c.template my_member_test<bool, bool> (true);
    


  • davie schrieb:

    return c.template my_member_test<bool, bool> (true);
    

    Ja, das klappt! Vielen Dank!
    👍



  • davie schrieb:

    return c.template my_member_test<bool, bool> (true);
    

    Hast du einen guten Link, wo das erklärt ist? So ein Problem hatte ich auch mal.



  • Hier ein guter Link: http://www.comeaucomputing.com/techtalk/templates/#esprobs - habe ich zwar selbst erst gefunden, aber die Leute von Comeau sollten es richtig gut wissen.

    Ansonsten im Standard unter §14.2/4 (für das spezifische x.template foo<int>()-Problem) und §14.6 für die Erklärung, was "abhängige Namen" genau bedeutet.


Anmelden zum Antworten