当前位置: 首页 > 知识库问答 >
问题:

使用自己的类和std::的“运算符==”的模糊重载string_view

齐鸿光
2023-03-14

我在<code>命名空间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));
}
}

这会导致其他代码无法编译(从堆栈中包含,省略):

错误:'operator=='的不明确重载(操作数类型为'std::basic_string_view'和'const char [3]')

注意:候选:'bool N::运算符==(const N::MyClass

备注:候选者:'constexr bool std::运算符==(std::basic_string_view

为什么还要考虑 N::operator==

-

编辑遇到问题的第一个代码

bool N::MyClass::f(const std::string_view& a_thing)
{return a_thing.substr(0,2) == "XY";}

--

最小工作示例:

#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";
        }
}

编译方式

g-std=c 17example.cpp

共有1个答案

欧阳勇
2023-03-14

MyClass 有一个与 std::string_view 一起使用的模板构造函数。

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

这意味着当您这样做时

bool N::MyClass::f(const std::string_view& a_thing)
{return a_thing.substr(0,2) == "XY";}

允许编译器将<code>转换为_thing。substr(0,2)到一个<code>MyClass。

避免此类情况的一种方法是使 MyClass 的构造函数显式化。

template<typename T,
    typename = std::void_t<decltype(T{}.data())>,
    typename = std::void_t<decltype(T{}.size())>>
    explicit MyClass(const T& a_source)
    {}
 类似资料:
  • 我在运算符过载时遇到问题 主要是我有 其中<code>Integer</code>只是<code>int</code>的包装,带有我需要的一些特殊功能。 然而,当我编译上面的代码时,我得到了错误C2679,它表示<code>binary' 我还试图删除友元声明中的参数,因此代码变成了: 但这会产生另一个错误:C2785:

  • 我有一个模板类包含其他类的优先级队列,我需要使用优先级重载器调用各个类重载器,根据各个类的偏好进行比较(在这种情况下是年龄,在另一个类中可能是价格。 我绝对相信我已经实现了不正确的运算符重载,因此非常感谢您的建议。 举个例子 我得到这个错误,我不知道我需要做什么来修复它。我必须将类重载保持为单个变量(Animal) 任务cpp:在“布尔运算符”的实例化中

  • 我在surf.h中有以下代码,其中声明了一个具有两种不同类型的模板类: 然后定义一个新类,其中创建了一个类型为T的向量(在field.h中) 在main.cpp中,我使用了这个字段。 我用G++(版本5.4)编译它,得到以下错误: 从main.cpp:2:0:field.h:在“std::ostream&operator<<(std::ostream&,const field&)[with T=s

  • 我在C#中定义了一个类(称为类A),并为它重载了一些算术运算符。让我们关注加法运算符(尽管我希望其他运算符的行为类似)。我已经设置了类A,这样我就可以向它添加标量(即单个Double值),我可以将它添加到标量中,或者我可以将A的两个实例一起添加。 所以在C#中,我用三个不同的签名重载了“”运算符。显式签名是: 一个双人间 < li >双A 答:答:答 当我在PowerShell中使用该类时,它只识

  • 本文向大家介绍浅谈C++类型转化(运算符重载函数)和基本运算符重载(自增自减),包括了浅谈C++类型转化(运算符重载函数)和基本运算符重载(自增自减)的使用技巧和注意事项,需要的朋友参考一下 类型转化(运算符重载函数) 用转换构造函数可以将一个指定类型的数据转换为类的对象。但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据)。在C++提供

  • 我正在为分数制作一个模板类,分子和分母可以是int、浮点数或双精度类型。当重载算术或关系运算符时,当我尝试添加两个类时,它会出现错误,比如A类和B类 在头文件“fraction. h”中 在cpp文件中 我期望它显示10.1/12.1,但是它给出编译器错误C2678,说二进制“”:没有找到接受“fraction”类型的左操作数的运算符(或者没有可接受的转换)。我花了很多时间试图解决这个问题,现在我