我有一個模板類,像這樣:模板類的==操作符()隱式轉換
struct Base
{
bool operator==(const Base& other) const {
return v == other.v;
}
int v;
};
struct Abc : public Base
{
void execute() { /*logic1*/ }
};
struct Def : public Base
{
void execute() { /*logic2*/ }
};
template <typename T>
class Foo
{
public:
bool operator==(const Foo& other) const {
return (a == other.a) && (b == other.b);
}
int a;
T b;
};
這工作得很好,但是我想延長這個操作符==()方法來允許只有在傳入的對象具有相同的模板類型時才相等。這裏有一個例子:
Foo<Abc> obj1;
Foo<Abc> obj2;
Foo<Def> obj3;
obj1 == obj2; // should be true
obj1 == obj3; // should fail at compile-time or run-time
當我這樣做:
bool operator==(const Foo& other) const {
std::cerr << typeid(other).name() << std::endl;
return (a == other.a) && (b == other.b);
}
我注意到,在傳遞的類的實例被隱式轉換爲這個類的類型。我想過在模板對象中加入一個成員變量來區分它們,但是有點煩人的是必須添加一個額外的變量,這感覺就像我不需要的那樣。有沒有更好的方法來實現這種平等測試?
您的運營商只能接受'美孚'或派生類。你是從Foo派生出來的嗎,它有隱含的構造函數嗎?問題是什麼。 –
「以允許相等只有在傳入的對象具有相同的模板類型時纔有效」。目前允許你不想要的其他類型? –
@NeilKirk - Foo沒有派生類。目前運算符==()通過隱式轉換適用於不同的T類型。我似乎只能選擇完全刪除運算符==()(以防止隱式轉換),或者將其保留並隱式轉換。我希望能夠比較兩個對象,如Foo和Foo ,並且無法在編譯時或運行時比較Foo 和Foo 。 –
Dan