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

操作员MSVC错误|

宗政文彬
2023-03-14

我正在开发一个广泛使用C模板的库。在编写时,我遇到了这样的代码(当然是简化的):

#include <sstream>

namespace ns{
    template<class A, class B>
    class c{};

    class a{};

    template<class A>
    class b{
    public:
        template<class B>
        auto
        take(A, B){
            return c<A, B>{};
        }
    };

    template<class A>
    auto
    make_b(A){
        return b<A>{};
    }

    template<class A, class B>
    auto
    operator|(A _a, B _b){
        return _b.take(_a, _b);
    }

}

using namespace ns;

int main(){
    a{} | make_b(a{});
    return 0;
}

在使用msvc 19(Visual Studio 2017)编译时,我遇到了以下错误:

/opt/compiler-explorer/windows/19.10.25017/lib/native/include/xlocale(314):警告C4530:使用了C异常处理程序,但未启用展开语义。指定/EHsc(28):错误C2228:左/右。采取“必须有类/结构/联合(28):注:类型为”

/opt/compiler-explorer/windows/19.10.25017/lib/native/include/xstring(2923):注意:请参阅正在使用[A=unsigned int,B=]编译的函数模板实例化“auto-ns::operator |(A,B)”/opt/compiler-explorer/windows/19.10.25017/lib/native/include/xstring(2922):注意:编译类模板成员函数“void std::basic\u string,std::allocator

/opt/compiler-explorer/windows/19.10.25017/lib/native/include/system\u error(658):注意:请参阅函数模板实例化“void std::basic\u string,std::allocator”

/opt/compiler-explorer/windows/19.10.25017/lib/native/include/stdexcept(22):注意:请参阅类模板实例化“std::basic\u string,std::allocator”

使用名称空间删除是可行的,但我不想禁止它(为什么我应该?)。有html" target="_blank">解决方案吗?

编辑:当然,我用GCC和Clang测试了代码——从4.9和clang3在GCC下编译,所以这完全是MSVC问题。

EDIT2:我查看了报告的错误,似乎MSVC在使用命名空间时,在其标准库中扩展了重载操作符的范围。


共有1个答案

司徒池暝
2023-03-14

它是这样工作的,但我无法解释为什么它不能以原来的方式工作,希望它能帮助其他人。

虽然我的猜测是,您的模板太宽了,它被std库中的一些代码所暗示。实际上,如果您只需注释掉任何std头或使用名称空间ns删除,代码也可以工作。

namespace ns {
    template<class A, class B>
    class c {};

    class a {};

    template<class A>
    class b {
    public:
        using MyA = A;
        template<class B>
        auto
            take(A, B) {
            return c<A, B>{};
        }
    };

    template<class A>
    auto
        make_b(A) {
        return b<A>{};
    }

    template<class B>
    auto
        operator|(typename B::MyA _a, B _b) {
        return _b.take(_a, _b);
    }
}

 类似资料:
  • 我必须做一个程序,找到最大的偶数3给定的数字。然而,我似乎无法让它工作,因为我一直收到这个错误消息。我到底做错了什么? 对于初学者的问题,我很抱歉,但我以前从未见过这个错误消息,也不知道它意味着什么,也不知道如何修复它。 提前谢谢你。

  • 公共类主{ } 第一天开始学习java。我面对一堵墙。我不知道为什么

  • 本节详细介绍可用于构造SQL表达式的运算符的用法。 这些方法是根据 Operators 和 ColumnOperators 基类。这些类的后代可以使用这些方法,包括: Column 物体 ColumnElement 对象,它们是所有核心SQL表达式语言列级表达式的根 InstrumentedAttribute 对象是映射的属性。 在教程部分中首先介绍了运算符,包括: SQLAlchemy 1.4/

  • 我理解下面的区别(至少对于Java): 但我的问题是,当你在处理布尔表达式时,有没有理由使用非短路运算符?是否有一些性能上的好处或使用不会被认为是坏的练习?

  • 本文向大家介绍Prolog操作员声明,包括了Prolog操作员声明的使用技巧和注意事项,需要的朋友参考一下 示例 在Prolog中,可以使用op/3以下命令定义自定义运算符: op(+Precedence, +Type, :Operator) 声明运算符为具有优先级的类型的运算符。运算符也可以是名称列表,在这种情况下,列表的所有元素都声明为相同的运算符。 优先级是介于0和1200之间的整数,其中0

  • 仅企业版可用 获取管理员列表接口 创建管理员 删除管理员