2016-05-19 4 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 
} 

なぜ最初のバージョンが機能しないのか、誰かが精緻化できますか?言い換えれば、なぜfuncのバイナリ演算子==は、変換演算子intを使用して、Baseにバインドされたテンプレートパラメータをintに変換しないのですか?変換演算子を使用したテンプレートパラメータ

バージョン1の作業を行うには、基本クラスを変更するだけですか?

+1

注:次の2つの暗黙の変換(コンストラクタおよびオペレータ)を持っています。問題を避けるために、1つを「明示的」(おそらくコンストラクタ)にします。 –

+0

ノートのおかげで – mkmostafa

答えて

3

funcは、const参照でパラメータを受け取りますが、はBaseクラスではconstメンバーではありません。 constメンバ関数としてマークすること、以下に示し、そしてあなたのコードがコンパイルされますよう:

#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

関連する問題