2015-12-02 35 views
1

我正在閱讀這個問題和其他一些東西:Are there cases where a typedef is absolutely necessary?模板轉換操作符returing對數組的引用

我寫了這個代碼:C++ 11的

const int arrayOfInt[10] = {0}; 

template<typename T, int N> using X = const T (&)[N]; 

struct foo 
{ 
    template<typename T, int N> operator X<int,10>() { return arrayOfInt; } 
}; 

void bar(const int (&) [10]) {} 

int main() 
{ 
    bar(foo()); 
    return 0; 
} 

using功能不是爲我工作,也是我無法想象如何typedef在這種情況下,返回類型也因爲我的foo類不是模板本身。我需要看到解決方案使用using關鍵字和typedef都。非常感謝真棒的人們:)

+3

它不應該是'運營商X '? –

+0

請始終在您說某些內容不工作時,發佈實際的編譯器錯誤消息。 – Petr

+0

@KerrekSB愛你:),謝謝你幫助我們noobs :) –

回答

1
template<typename T, int N> operator X<int,10>() { return arrayOfInt; } 

模板參數T和N從不使用,因此永遠不會推導出來。

固定Live On Coliru

const int arrayOfInt[10]{0}; 

template<typename T, int N> using X = T const (&)[N]; 

struct foo { 
    template<typename T, int N> operator X<T,N>() const { return arrayOfInt; } 
}; 

void bar(const int (&) [10]) {} 

int main() 
{ 
    foo f; 
    X<int, 10> v = f; 
    bar(foo()); 
} 
+0

非常感謝,但請你在我的代碼模板< typename T,int N> operator X (){return arrayOfInt; }' - >'X '不會更改您的更正的代碼的代碼的語義,但它會產生錯誤。謝謝 –

+0

你更換什麼部件?我沒有看到區別。問題是沒有辦法明確指定'T'和'N'(afaik)的參數。 – sehe

+0

真棒,現在我意識到我的小錯誤。謝謝很多先生:) –

2

由於X是一個別名模板,你需要明確提供模板參數;他們不會從周邊範圍捕獲:

struct foo 
{ 
    template<typename T, int N> 
    operator X<T,N>() { return arrayOfInt; } 
    //  ^^^^^ 
}; 

你不能用一個typedef做到這一點,因爲沒有這樣的東西作爲一個typedef模板。

+0

,但我仍然得到錯誤「錯誤:從'foo'類型的表達式'const int(&)[10]'的引用無效初始化」 –