2016-05-19 20 views
1
#include <iostream> 

template <typename T1, typename T2> 
bool func(const T1& t, const T2& t2) { 
    return t == t2; 
} 


class Base { 
public: 
    bool operator ==(const Base&) const { return true;} 
    Base(int y) : x(y) {} 
    operator int() { 
     return x; 
    } 
    int x; 
}; 

int main() { 
    func<long, Base>(4L, Base(5)); // not ok 
    func<long, long>(4L, Base(5)); //ok 
} 

Kann jemand ausarbeiten, warum die erste Version nicht funktioniert? Mit anderen Worten, warum verwendet der binäre Operator == in func nicht den Konvertierungsoperator int, um den an basis gebundenen Schablonenparameter in int umzuwandeln?Vorlagenparameter mit Umwandlungsoperator

Gibt es sowieso, um Version 1 zu arbeiten, indem Sie nur die Klasse Base ändern?

+1

Hinweis: Sie haben zwei implizite Konvertierungen (der Konstrukteur und der Betreiber). Machen Sie eine explizite Anweisung (vielleicht den Konstruktor), um Probleme zu vermeiden. –

+0

danke für den Hinweis – mkmostafa

Antwort

3

Ihre func akzeptiert ihre Parameter durch const-Referenz, aber die operator int() definiert in Ihrer Base Klasse ist eine nicht-const Mitgliedsfunktion. Markieren Sie es als eine konstante Elementfunktion, wie unten dargestellt, und Ihr Code kompiliert:

#include <iostream> 

template <typename T1, typename T2> 
bool func(const T1& t, const T2& t2) { 
    return t == t2; 
} 


class Base { 
public: 
    bool operator ==(const Base&) const { return true;} 
    Base(int y) : x(y) {} 
    operator int() const { 
     return x; 
    } 
    int x; 
}; 

int main() { 
    func<long, Base>(4L, Base(5)); // ok now! 
    func<long, long>(4L, Base(5)); // ok 
} 

Live example

Verwandte Themen