2013-04-29 45 views
1

我試圖超載[]運營商,所以我可以訪問std::tuple的元素。出於某種原因,我收到以下錯誤:爲什麼我得到「在函數體外使用參數'N'」?

prog.cpp:11:73: error: use of parameter ‘N’ outside function body
prog.cpp:11:73: error: use of parameter ‘N’ outside function body
prog.cpp:11:73: error: use of parameter ‘N’ outside function body
prog.cpp:11:89: error: template argument 1 is invalid

很奇怪,因爲他們大多是第一次的重複。我不明白爲什麼我得到這個錯誤,因爲不是晚期返回類型的全部要點,以便我們可以使用返回類型的參數?

#include <tuple> 

template <class... Args> 
struct type_list 
{ 
    std::tuple<Args...> var; 

    type_list(Args&&... args) : var(std::forward<Args>(args)...) {} 

    auto operator[](std::size_t const N) -> typename std::tuple_element<N, std::tuple<Args...>>::type&& 
    { 
     return std::get<N>(var); 
    } 
}; 

int main() 
{ 
    type_list<int, int, bool> array(2, 4, true); 
} 

如果任何人都可以解釋爲什麼這種情況正在發生,我怎麼能得到這個工作,這將是非常讚賞。謝謝。

+1

想想你要的是什麼,一分鐘。您希望函數的*類型根據傳遞給它的(運行時變化的)*值*而改變?這可能會以非類型化的腳本語言飛行,但不能用C++語言。 – 2013-04-29 22:59:25

回答

5

您正在嘗試使用函數參數Noperator[](這是在編譯時不知道)作爲std::tuple_element模板參數,它必須在編譯時是已知的。

+0

爲什麼在編譯時不能知道它? – 2013-04-29 22:59:13

+4

@templateboy:因爲我可以寫'size_t我; cin >> i; cout << yourobject [i];'編譯器在那裏使用哪一個'operator <<'重載? – 2013-04-29 23:00:54

+1

有什麼辦法可以使參數'constexpr'? – 2013-04-29 23:03:55

2

模板參數N是編譯時的東西,而operator[]參數N僅在運行時實現。編譯器不知道N是什麼,所以它不能把它作爲模板參數。

相關問題