error C2665: “std::locale::facet::operator new”: 2 個重載中沒有一個可以轉換所有參數類型


qt項目 qt creator項目由插件自動轉換成的vs2015項目,為了發布少帶些dll ,切換成vs2013項目,在更改了一些vs2013不支持的c++新標准寫法之后,release可正常編過,但是debug報錯,具體如下

vs 報錯:

DataManager.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocale(122): error C2665: “std::locale::facet::operator new”: 2 個重載中沒有一個可以轉換所有參數類型
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocale(125): 可能是“void *std::locale::facet::operator new(size_t,const std::_DebugHeapTag_t &,char *,int)”
1>          嘗試匹配參數列表“(size_t, const std::_DebugHeapTag_t, const char [71], int)”時
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocale(758): error C2665: “operator new[]”: 5 個重載中沒有一個可以轉換所有參數類型
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xdebug(37): 可能是“void *operator new[](size_t,const std::_DebugHeapTag_t &,char *,int) throw(...)”
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\crtdbg.h(1080): 或       “void *operator new[](size_t,int,const char *,int)”
1>          嘗試匹配參數列表“(unsigned int, const std::_DebugHeapTag_t, const char [71], int)”時
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocale(794): error C2665: “operator new[]”: 5 個重載中沒有一個可以轉換所有參數類型
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xdebug(37): 可能是“void *operator new[](size_t,const std::_DebugHeapTag_t &,char *,int) throw(...)”
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\crtdbg.h(1080): 或       “void *operator new[](size_t,int,const char *,int)”
1>          嘗試匹配參數列表“(unsigned int, const std::_DebugHeapTag_t, const char [71], int)”時
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocale(1652): error C2665: “std::locale::facet::operator new”: 2 個重載中沒有一個可以轉換所有參數類型
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocale(125): 可能是“void *std::locale::facet::operator new(size_t,const std::_DebugHeapTag_t &,char *,int)”
1>          嘗試匹配參數列表“(unsigned int, const std::_DebugHeapTag_t, const char [71], int)”時
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocale(1887): error C2665: “std::locale::facet::operator new”: 2 個重載中沒有一個可以轉換所有參數類型
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocale(125): 可能是“void *std::locale::facet::operator new(size_t,const std::_DebugHeapTag_t &,char *,int)”
1>          嘗試匹配參數列表“(unsigned int, const std::_DebugHeapTag_t, const char [71], int)”時
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocale(2473): error C2665: “std::locale::facet::operator new”: 2 個重載中沒有一個可以轉換所有參數類型
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocale(125): 可能是“void *std::locale::facet::operator new(size_t,const std::_DebugHeapTag_t &,char *,int)”
1>          嘗試匹配參數列表“(unsigned int, const std::_DebugHeapTag_t, const char [71], int)”時
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocale(2669): error C2665: “std::locale::facet::operator new”: 2 個重載中沒有一個可以轉換所有參數類型
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocale(125): 可能是“void *std::locale::facet::operator new(size_t,const std::_DebugHeapTag_t &,char *,int)”
1>          嘗試匹配參數列表“(unsigned int, const std::_DebugHeapTag_t, const char [71], int)”時
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocale(2896): error C2665: “std::locale::facet::operator new”: 2 個重載中沒有一個可以轉換所有參數類型
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocale(125): 可能是“void *std::locale::facet::operator new(size_t,const std::_DebugHeapTag_t &,char *,int)”
1>          嘗試匹配參數列表“(unsigned int, const std::_DebugHeapTag_t, const char [71], int)”時
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xiosbase(455): error C2665: “operator new”: 5 個重載中沒有一個可以轉換所有參數類型
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xdebug(33): 可能是“void *operator new(size_t,const std::_DebugHeapTag_t &,char *,int) throw(...)”
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\crtdbg.h(1072): 或       “void *operator new(size_t,int,const char *,int)”
1>          嘗試匹配參數列表“(unsigned int, const std::_DebugHeapTag_t, const char [72], int)”時
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xiosbase(537): error C2665: “operator new”: 5 個重載中沒有一個可以轉換所有參數類型
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xdebug(33): 可能是“void *operator new(size_t,const std::_DebugHeapTag_t &,char *,int) throw(...)”
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\crtdbg.h(1072): 或       “void *operator new(size_t,int,const char *,int)”
1>          嘗試匹配參數列表“(unsigned int, const std::_DebugHeapTag_t, const char [72], int)”時
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xiosbase(591): error C2665: “operator new”: 5 個重載中沒有一個可以轉換所有參數類型
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xdebug(33): 可能是“void *operator new(size_t,const std::_DebugHeapTag_t &,char *,int) throw(...)”
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\crtdbg.h(1072): 或       “void *operator new(size_t,int,const char *,int)”
1>          嘗試匹配參數列表“(unsigned int, const std::_DebugHeapTag_t, const char [72], int)”時
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xlocnum(65): error C2665: “operator new[]”: 5 個重載中沒有一個可以轉換所有參數類型
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xdebug(37): 可能是“void *operator new[](size_t,const std::_DebugHeapTag_t &,char *,int) throw(...)”
1>          C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\crtdbg.h(1080): 或       “void *operator new[](size_t,int,const char *,int)”
1>          嘗試匹配參數列表“(unsigned int, const std::_DebugHeapTag_t, const char [71], int)”時

----------------------------------------------------------------------------------------------------------------------------------

查了下 error C2665: “operator new[]”: 5 個重載中沒有一個可以轉換所有參數類型,對應的c2665 有如下兩個解決方案:
from:http://blog.csdn.net/machh/article/details/43450725
解決方法1:注釋掉以下代碼:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

解決方法2:
將:代碼中的#include <vector>移到stdafx.h的開頭,也就是#program once的后面。

但並沒有解決我的問題。

對比正常工程 發現c/c++  ->所有選項-->附加選項 多了-Zc:strictStrings ,應該是qt轉換插件自動加的,去掉就可以正常編譯了。

解釋見:https://msdn.microsoft.com/zh-cn/library/dn449508.aspx

若要了解有關 Visual Studio 2017 RC 的最新文檔,請參閱 Visual Studio 2017 RC 文檔

指定后,編譯器要求通過使用字符串文本初始化的指針符合嚴格的 const 限定。

 
 
/Zc:strictStrings[-]  

如果指定了 /Zc:strictStrings,則編譯器針對字符串文本(如類型“const char 的數組”或“const wchar_t 的數組”,具體取決於聲明)強制執行標准 C++ const 限定。 字符串文本不可變,並且嘗試修改一個字符串文本的內容將導致在運行時出現訪問沖突錯誤。 必須將字符串指針聲明為 const 以通過使用字符串文本將其初始化,或使用顯式 const_cast 以初始化非 const 指針。 或者默認情況下,如果指定了 /Zc:strictStrings-,則編譯器不會針對通過使用字符串文本初始化的字符串指針強制執行標准 C++ const 限定。

使用 /Zc:strictStrings 選項來阻止編譯錯誤代碼。 此示例顯示一個簡單聲明錯誤如何在運行時導致崩潰:

C++
 
// strictStrings_off.cpp  
// compile by using: cl /W4 strictStrings_off.cpp int main() { wchar_t* str = L"hello"; str[2] = L'a'; // run-time error: access violation } 

/Zc:strictStrings 處於啟用狀態時,相同的代碼將報告 str 聲明中的錯誤。

C++
 
// strictStrings_on.cpp  
// compile by using: cl /Zc:strictStrings /W4 strictStrings_on.cpp int main() { wchar_t* str = L"hello"; // error: Conversion from string literal // loses const qualifier str[2] = L'a'; } 

如果使用 auto 聲明字符串指針,則編譯器將為你創建正確的 const 指針類型聲明。 嘗試修改 const 指針的內容將由編譯器報告為錯誤。

System_CAPS_ICON_note.jpg 說明

Visual Studio 2013 中的 Visual C++ 中的標准 C++ 庫不支持調試生成中的 /Zc:strictStrings 編譯器選項。 如果在你的生成輸出中看到多個 C2665 錯誤,則可能由此原因造成。

有關 Visual C++ 中的一致性問題的詳細信息,請參閱非標准行為

在 Visual Studio 開發環境中設置此編譯器選項

  1. 打開項目的“屬性頁”對話框。 有關詳細信息,請參見使用項目屬性

  2. 選擇 C/C++ 文件夾。

  3. 選擇“命令行”屬性頁。

  4. 修改“附加選項”屬性以包含 /Zc:strictStrings,然后選擇“確定”

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM