Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 运算符==()的模板化类的隐式转换_C++_Templates_Operator Keyword_Implicit Conversion - Fatal编程技术网

C++ 运算符==()的模板化类的隐式转换

C++ 运算符==()的模板化类的隐式转换,c++,templates,operator-keyword,implicit-conversion,C++,Templates,Operator Keyword,Implicit Conversion,我有一个模板类,如下所示: 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*

我有一个模板类,如下所示:

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;
};
struct Base
{
布尔运算符==(常数基和其他)常数{
返回v==other.v;
}
INTV;
};
结构Abc:公共基础
{
void execute(){/*logic1*/}
};
结构定义:公共基
{
void execute(){/*logic2*/}
};
模板
福班
{
公众:
布尔运算符==(常量Foo和其他)常量{
返回(a==其他.a)和&(b==其他.b);
}
INTA;
tb;
};

这很好,但是我想扩展这个操作符==()方法,以便仅当传入的对象是相同的模板类型时,等式才有效。下面是一个例子:

Foo<Abc> obj1;
Foo<Abc> obj2;
Foo<Def> obj3;

obj1 == obj2; // should be true
obj1 == obj3; // should fail at compile-time or run-time
Foo-obj1;
Foo-obj2;
Foo-obj3;
obj1==obj2;//应该是真的
obj1==obj3;//应该在编译时或运行时失败
当我这样做时:

bool operator==(const Foo& other) const {
    std::cerr << typeid(other).name() << std::endl;
    return (a == other.a) && (b == other.b);
}
bool运算符==(常量Foo和其他)常量{

据我所知,存在从
Foo
Foo
的隐式转换

可能的解决办法是:

  • 禁止隐式类型转换(对构造函数和强制转换运算符使用
    explicit
    关键字)

  • operator==
    设置为模板,并使用
    enable\u if
    仅允许可能的组合:

    template <typename T1, typename = std::enable_if<std::is_same<T, T2>::value>::type>
    bool operator == (const Foo<T1>& other) const
    
    模板
    布尔运算符==(常量Foo和其他)常量
    

  • 您的运算符只能接受
    Foo
    或派生类。您是否从Foo派生,它是否具有隐式构造函数?问题是什么。“若要仅在传入的对象为相同模板类型时才允许等式有效”。您当前不希望使用的其他类型有哪些?@NeilKirk-没有来自Foo的派生类。目前运算符==()通过隐式转换适用于不同的t类型。我似乎只能选择完全删除运算符==()(以防止隐式转换),或保留它并进行隐式转换。我希望能够比较两个对象,例如Foo和Foo,但在编译时或运行时都无法比较Foo和Foo。@n.m.-它当前允许T的任何其他类型具有相同的成员变量,我希望不允许这样做,因为功能不同。有关更多c的信息,请参阅上面的答复ontext。发布的代码与您的声明不匹配。请给出一个示例,比较
    Foo
    Foo
    ,编译器允许。谢谢,第二个选项看起来是可行的。您能否给出第一个选项对该用例有何帮助的示例?请按照注释中的要求提供更多的代码。