2012-11-27 25 views
3

我試圖將指針傳遞給作爲模板參數的struct s數組。我總算過了一段時間做到這一點:作爲模板參數的結構數組

struct something{}; 

constexpr const something single; 
constexpr const something array[12]; 
template<const something* arg> void f() {} 

template<typename T> 
constexpr T* workaround(T* v){ 
    return v; 
}; 

void bind(){ 
    f<&single>();      //OK 
    f<array>();       //NO 
    f<&array>();      //NO 
    f<&array[0]>();      //NO 
    f<workaround(array)>();    //NO 
    f<(const something*)array>();  //OK 
} 

這是一個地方的陣列不能透明地用作指針罕見的情況下,或者是一個編譯器錯誤?

+0

你試過指向數組? – Pubby

+0

FWIW,Apple clang v4.1(clang v3.1)不會編譯大部分內容。對於初學者來說,它拒絕'single'和'array'的默認初始化,因爲'something'沒有用戶定義的默認構造函數。當我改變它以便它們被初始化時(例如'constexpr const Elem single {}'),它拒絕調用'f'報告的所有變體:「候選模板被忽略:模板參數'arg'的無效顯式指定參數。 – imaginaryboy

回答

1

我真的相信了電話,f<array>();的最簡單的形式,它的工作,只要你正確地申報,界定array

struct Elem 
{ }; 

constexpr const Elem array[5] { {} , {} , {} , {} , {} }; 

template<const Elem* arg> void f() 
{ } 

int main() 
{ 
    f<array>(); 
    return 0; 
} 

我改變(除了12至5元降低陣列的唯一的事)是爲array添加初始化程序。

(編譯這對我來說,使用GCC 4.7.2。)

+0

爲什麼初始化在這裏重要? –

+0

@LorenzoPistone由於'array'是一個常量表達式,編譯器在評估模板時需要定義它的定義。該定義由初始化提供。缺少的初始化是GCC似乎困惑的唯一事情。 – jogojapan

+0

但是然後'f <(const something *)array>()'不應該有效。 –

1

這個鬼混與蘋果鐺4.1版,我在下面的代碼編譯到了。我不得不承認,我不知道Clang是否堅持要求singlearray的外部鏈接是正確的。此外,根據jogojapan的修改沒有特別原因。

struct Elem {}; 

extern const Elem single; 
extern const Elem array[3]; 

constexpr const Elem single {}; 
constexpr const Elem array[3] {{},{},{}}; 

template<const Elem* arg> void f() 
{ } 

int main() 
{ 
    f<&single>(); 
    f<array>(); 
    return 0; 
} 

FWIW,我來到這個鏡頭在黑暗中過這個絆腳石後: http://lists.apple.com/archives/xcode-users/2006/Jun/msg00799.html