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)
{}