Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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++ 用于'的不明确重载;运算符==';使用自己的类和std::string\u视图_C++_C++11_Namespaces_Operator Overloading_Name Lookup - Fatal编程技术网

C++ 用于'的不明确重载;运算符==';使用自己的类和std::string\u视图

C++ 用于'的不明确重载;运算符==';使用自己的类和std::string\u视图,c++,c++11,namespaces,operator-overloading,name-lookup,C++,C++11,Namespaces,Operator Overloading,Name Lookup,我在名称空间N中创建了一个名为MyClass的类。现在我在名称空间N中定义了一个全局操作符== namespace N { class MyClass { // member function begin() // member function end() // content omitted } template<typename T> bool operator==(const MyClass& a_mc, const T& a_other) { us

我在
名称空间N
中创建了一个名为
MyClass
的类。现在我在
名称空间N
中定义了一个全局
操作符==

namespace N
{
class MyClass
{
// member function begin()
// member function end()
// content omitted
}

template<typename T>
bool operator==(const MyClass& a_mc, const T& a_other)
{
    using namespace std;
    return std::equal(a_mc.begin(), a_mc.end(), begin(a_other));
}
}
--

最简单的工作示例:

#include <algorithm>
#include <string_view>
#include <type_traits>

namespace N
{
        struct MyClass
        {
                MyClass() noexcept = default;
                template<typename T,
                        typename = std::void_t<decltype(T{}.data())>,
                        typename = std::void_t<decltype(T{}.size())>>
                MyClass(const T& a_source)
                {}

                const char* begin() const { return 0; } // stub
                const char* end() const { return 0; } // stub
                bool f(const std::string_view& a_thing);
        };

        template<typename T>
        bool operator==(const MyClass& a_mc, const T& a_other)
        {
            using namespace std;
            return std::equal(a_mc.begin(), a_mc.end(), begin(a_other));
        }

        bool MyClass::f(const std::string_view& a_thing)
        {
                return a_thing.substr(0,2) == "XY";
        }
}
#包括
#包括
#包括
名称空间N
{
结构MyClass
{
MyClass()noexcept=默认值;
模板
MyClass(常量T&a_源)
{}
const char*begin()const{return 0;}//存根
const char*end()const{return 0;}//存根
bool f(const std::string_view&a_thing);
};
模板
布尔运算符==(常数MyClass&a\u mc,常数T&a\u其他)
{
使用名称空间std;
返回std::equal(a_mc.begin(),a_mc.end(),begin(a_other));
}
boolmyclass::f(const std::string\u view&a\u thing)
{
返回一个对象。substr(0,2)=“XY”;
}
}
编译

g++-std=c++17 example.cpp


MyClass有一个模板构造函数,可与
std::string\u视图
一起使用

由于构造函数未标记为显式,因此允许编译器将其用于隐式转换

这意味着当你这么做的时候

bool N::MyClass::f(const std::string_view& a_thing)
{return a_thing.substr(0,2) == "XY";}
允许编译器将
a_thing.substr(0,2)
转换为
MyClass
,然后可以使用它调用
bool操作符==

避免这种情况的一种方法是使
MyClass
的构造函数显式

template<typename T,
    typename = std::void_t<decltype(T{}.data())>,
    typename = std::void_t<decltype(T{}.size())>>
    explicit MyClass(const T& a_source)
    {}
模板
显式MyClass(常量T&a_源)
{}

N::operator==
考虑用于什么?请提供一个完整的例子。我们需要一个完整的可复制的例子。我确实知道我必须添加什么代码才能得到类似的错误,但我不知道您有什么代码,因此不可能以有意义的方式回答
MyClass
是否有转换构造函数?无法复制:
使用命名空间std;返回标准::相等(…)毫无意义,不是吗?通常你会使用std::equal来
;返回相等(…)。为什么错误消息指出操作数类型为“std::basic_string_view”和“const char[3]”?左侧为
std::string_view
,右侧为
“XY”
,可推断为
const char[3]
通过模板。@std\u unordered\u映射另一种说法是,如果
运算符==
不存在,
“XY”
将转换为
std::string\u视图
。但是,由于这两种情况以及您的
运算符==
都需要1个转换才能工作,因此不清楚应该选择哪一个。
template<typename T,
    typename = std::void_t<decltype(T{}.data())>,
    typename = std::void_t<decltype(T{}.size())>>
    explicit MyClass(const T& a_source)
    {}