MSVC 错误与运算符 |
MSVC error with operator |
我正在开发一个广泛使用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:".take"的左侧必须具有类/结构/联合 (28):注意:类型为">
/opt/compiler-explorer/windows/19.10.25017/lib/native/include/xstring(2923): 注意:请参阅函数模板实例化 'auto ns::operator |(A,B)'正在编译中 跟 [ A=无符号整数, B= ]/opt/compiler-explorer/windows/19.10.25017/lib/native/include/xstring(2922): 注意:编译类模板成员函数时 'void std::basic_string,std:::allocator>::shrink_to_fit(void)'
/opt/compiler-explorer/windows/19.10.25017/lib/native/include/system_error(658): 注意:请参阅正在编译的函数模板实例化"void std::basic_string,std:::分配器>::shrink_to_fit(void)"的参考
/opt/compiler-explorer/windows/19.10.25017/lib/native/include/stdexcept(22): 注意:请参阅正在编译的类模板实例化"std::basic_string,std::allocator>"的参考
删除using namespace
有效,但我不想禁止它(我为什么要这样做?有解决办法吗?
编辑:当然,我用GCC和Clang测试了代码 - 从4.9和clang3在GCC下编译,所以它只是MSVC问题。
EDIT2:我查看了报告的错误,似乎 MSVC 在使用using namespace
时正在扩展其标准库中重载operator|
的范围。
它以这种方式工作,但我无法解释为什么它不能以原始方式工作,希望它能帮助其他人。
虽然我的猜测是你的模板太宽泛了,它被 std 库中的一些代码所干扰。实际上,如果您只是注释掉任何 std 标头或删除using namespace 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);
}
}
- C++分数混合比较运算符错误
- 尝试将文件写入数组时运算符<<错误
- 我在C++中遇到插入运算符错误
- 可变长度数组 c++ & 没有运算符>>错误?
- ostream 运算符<<错误C++
- 运算符'=='错误
- 尝试从向量返回对象时出现"没有可行的重载运算符 [] 错误
- 字符串输入中没有匹配的错误运算符错误
- 唯一指针中的赋值运算符错误
- c++ 类型不提供调用运算符错误
- CIN 和 COUT 运算符错误C++
- C++ 未读取我的 % 运算符(错误:"运算符%"不匹配)
- { } 构造函数实现中的赋值运算符 => 错误
- C++重载运算符<错误
- C++ 矢量查找() 重载运算符 - 错误
- 重载的"运算符+"必须是一元或二进制运算符错误
- C++对象 [实现] 运算符 == 错误
- 无法在 Visual Studio 2013 中运行非常基本的代码 - 运算符">>"错误/生成错误
- 自制矢量模板运算符 [] 错误
- C++ 重载<<运算符错误