C2440编译错误:__cplusplus编译选项引发的

简介: C2440编译错误:__cplusplus编译选项引发的
  • error C2440: “=”: 无法从“_Ty”转换为“T”


// qhashfunctions.h
// like std::exchange
template <typename T, typename U = T>
Q_DECL_RELAXED_CONSTEXPR T qExchange(T &t, U &&newValue)
{
    T old = std::move(t);
    t = std::forward<U>(newValue); // here
    return old;
}


  • error C2440: “reinterpret_cast”: 无法从“int”转换为“quintptr”


// qglobal.h
Q_DECL_CONST_FUNCTION inline uint qHash(std::nullptr_t, uint seed = 0) noexcept
{
    return qHash(reinterpret_cast<quintptr>(nullptr), seed);// here
}


排查了好久,提示无法从int转换为qunitptr,可是nullptr怎么是int呢?


最终发现httpglobal.h发现有重定义nullptr,问题就出在这个为什么导致重定义上?


image.png


问题就出在这个__cplusplus上,查阅资料发现,这个是vs的历史遗留问题,增加编译选项/Zc:__cplusplus即可


image.png


CMake中增加编译选项:


if(MSVC)
    target_compile_options(${APP_NAME} PUBLIC "/Zc:__cplusplus")
endif()
目录
相关文章
|
6月前
|
编译器 Linux 开发工具
|
存储 Cloud Native 编译器
MSVC编译器的选择说明
MSVC编译器的选择说明
|
6月前
|
存储 自然语言处理 算法
|
编译器 程序员 C语言
C 语言标准及编译器介绍
今天给大家介绍一下C语言标准及其由来
359 0
|
芯片 C++
【MDK(keil)编译错误】找不到main.o及解决方法、多处报错“未定义”
【MDK(keil)编译错误】找不到main.o及解决方法、多处报错“未定义”
1135 0
【MDK(keil)编译错误】找不到main.o及解决方法、多处报错“未定义”
|
编译器 C语言 C++
Makefile中常见的gcc编译参数
Makefile中常见的gcc编译参数
396 0
|
JSON JavaScript 编译器
Typescrip编译选项
Typescrip编译选项
|
自然语言处理 编译器
【译】一个超级小的编译器
【译】一个超级小的编译器
83 0
|
C++ 编译器
C++ 编译器
C++编译器 当我们定义了一个类的时候, C++编译器在默认的情况下会为我们添加默认的构造方法, 拷贝构造方法, 析构函数和=运算符 在第一次创建对象的语句中如: MyString myString = "hello, world!";中, 如果我们定义的构造函数为如下, 则就是隐式调用构造方法,...
1754 0
|
C语言 C++ 编译器
不同编译器对预编译头文件的处理
最近为了给xmake实现预编译头文件的支持,研究了下各大主流编译器处理预编译头的机制以及之间的一些差异。 现在的大部分c/c++编译器都是支持预编译头的,例如:gcc,clang,msvc等,用于优化c++代码的编译速度,毕竟c++的头文件如果包含了模板定义的话,编译速度是很慢的, 如果能够吧大部分通用的头文件放置在一个header.h中,在其他源码编译之前预先对其进行编译,之后的代码都能重用这部分预编译头,就可以极大程度上减少频繁的头文件冗余编译。
1556 0