2

考慮下面的代碼:爲什麼checked_array_iterator在VS2013中不包括<iterator>,但在VS2017中失敗?

#include <memory> 
#include <locale> 

int main() { 
    auto source = std::make_unique<int[]>(16); 
    auto dest = std::make_unique<int[]>(16); 
    auto dp = stdext::checked_array_iterator<int*>(dest.get(), 16); 
    std::copy_n(source.get(), 16, dp); 
    return 0; 
} 

它通過運行cl.exe /EHsc <file>.cpp完全編譯上的Visual Studio 2013。然而,在Visual Studio中2017年出現以下錯誤(等等)是由cl.exe拋出:

vc12.cpp(7): error C2653: 'stdext': is not a class or namespace name 
vc12.cpp(7): error C2065: 'checked_array_iterator': undeclared identifier 

爲什麼這個代碼不再編譯?

+0

的問題可能是很具體,但在大項目我花了相當長的時間才弄清楚爲什麼它在VS2013上編譯,沒有搜索引擎取得任何結果。 – Lennart

+1

順便說一句,應該是'int main'。 'void main'不是可移植的C++。 –

+0

@BaummitAugen:是的,我儘量保持最小。將添加'int'和'return'。 – Lennart

回答

1

該示例缺少#include <iterator>。從技術上講,Visual Studio 2013也缺少它(請參閱Why include what you use),但由於包含它的鏈條,它在那裏工作。在Visual Studio 2013和Visual Studio 2017之間,包括std - 的頁眉已經改版。

該示例顯示#include <locale>。在舊版本中,#include <iterator>locale的包含鏈的一部分,在Visual Studio 2017中不再是這種情況。

但是,由於VS2017非常新,因此很難找到它的文檔。重要文件可在doc.microsoft.com找到,它列出了所需的標題<iterator>

0

根據文檔https://docs.microsoft.com/en-us/cpp/standard-library/checked-array-iterator-class包含在中但是您需要登錄#include <iterator>

雖然不是爲了糾正這個問題,但我會隨同編寫標準的一致性代碼。做到這一點的最好方法是隻使用靜態分配的數組。這將允許你使用C++的beginendsize功能與它的工作:https://stackoverflow.com/a/33442842/2642059

有些情況下,這不會是一個很好的建議,如果動態數組是一個必須具備的,可以考慮使用vector。如果你無法忍受,然後使用unique_ptr的容器是做到這一點的好辦法,但不是取決於checked_array_iterator喜歡保持自己的尺寸:

const size_t sourceSize = 16; 
auto source = std::make_unique<int[]>(sourceSize); 
auto dest = std::make_unique<int[]>(sourceSize); 
std::copy_n(source.get(), sourceSize, dest.get()) 
相關問題