2016-10-19 82 views
-1

Visual Studio 2013在語言數組上有些奇怪,它在全局函數中允許初始化爲char result[100] = { 0 };,但不是如果它是類的成員 - Workaround for error C2536: cannot specify explicit initializer for arrays in Visual Studio 2013,對於int m_array[3];裏面的class A,A() :m_array{ 0, 1, 2 } {}失敗並顯示錯誤C2536:「'A :: A :: m_array':無法爲數組指定顯式初始值設定項」。C2660:_splitpath_s在Visual Studio 2013中失敗,出現std :: array錯誤

在同一職位a work-around is suggested,使用 std::array<int, 3> m_array;而不是與 A() : m_array ({ 0, 1, 2 }) {} initilzie,IDE紅色下劃線「0」暗示「錯誤:括號不能爲這個子對象的初始化可以省略。」但可以通過編譯。

更好,one comments建議使用額外的一對大括號 A() : m_array ({ { 0, 1, 2 } }) {},現在一切順利!

要傳遞一個std::array於需要char *參數的函數,std::array over c style array建議使用my_array.data()其中my_arraystd::array

現在我遇到了一個問題_spitpath_s

傳統char *風格編譯 _splitpath_s(fullpathfilename, drive, dir, name, ext)其中的參數都char陣列;但使用std::array將觸發錯誤C2660:

class B2 
{ 
public: 
    const int MAX_LEN = 200; 
    std::array<char, 200> drive, dir, name, ext; 
    B2() :drive({ { 0 } }), dir({ { 0 } }), name({ { 0 } }), ext({ { 0 } }) {} 
    void split(const char * fullpathfilename) { 
     _splitpath_s(fullpathfilename, drive.data(), dir.data(), name.data(), ext.data()); //error C2660: '_splitpath_s' : function does not take 5 arguments 
    } 
}; 

爲什麼_splitpath_s在這裏失敗?這是一箇舊的C風格函數,在stdlib.h中定義,如果在C++中有解決方法,也是可以接受的。

+1

C和C++是不同的語言。請僅使用相關標籤(本例中爲C++)。 – kaylum

+0

@kaylum'_splitpath_s'是舊C日'stdlib.h'中的一個函數。 – athos

+0

@athos:無關緊要 - 您正在編寫C++。 '_splitpath_s'實際上是一個Windows API函數,不屬於C. –

回答

2

_splitpath_s 5參數的版本是一個模板函數,期待一個字符指針的輸入路徑,且用於另一4. C風格字符數組由於要傳遞在C++ array目的,不產生模板和,由於SFINAE它不可用,所以沒有函數需要5個參數。

要使用它,你必須使用9參數版本,在那裏你輸入地址和緩衝區大小。

+1

但是'dir','name'和'ext'也需要'.data',然後(因爲它返回一個'char *')你需要傳遞長度。 – 1201ProgramAlarm

+0

你是對的,我可以使用9參數版本。但還有一個問題,C++函數的解析如何區分'char *'和'char *'?我認爲在調用期間,從char數組到「char」指針的自動「衰減」? – athos

+2

數組在傳遞給函數時會衰減爲指針,但在模板實例化中,編譯器會以不同方式處理它們。在這種情況下,它使用已知的編譯時間數組大小填充適當的值,然後調用9參數版本。 – 1201ProgramAlarm

相關問題