2011-09-13 45 views
1

我'不知道是否有可能訪問的給定爲在以後的模板參數前面的模板參數模板參數列表,像這樣的類型的類型定義:訪問模板參數列表中以前模板參數的typedefs?

#include <iostream> 

template<typename V> 
struct TypeHolder { 
    typedef V value_type; 
}; 

template<typename T, T::value_type v> 
struct ValueHolder { 
    const static typename T::value_type value = v; 
}; 

int main() { 
    typedef TypeHolder<int> IntTypeHolder; 
    typedef ValueHolder<IntTypeHolder,5> Five; 

    std::cout << Five::value << std::endl; 

    return 0; 
} 

當我編譯上面的例子中,我得到以下錯誤:

[email protected]:~$ g++ -o cpptest test.cpp
test.cpp:8:25: error: 'T::value_type' is not a type

這是由於錯誤的語法或什麼,我想在C++做的只是不可能++?

+2

你的第一個問題是結構定義末尾缺少分號。我修復了這個問題,並更新了更相關的錯誤。如果我做錯了,請告訴我。 –

回答

0

這是由於錯誤的語法,你試圖做的T::value_type v是爲了得到一個正確的值?

然後更好地利用類似的東西:

template<typename T> 
struct ValueHolder { 
    const static typename T::value_type value; 
    ValueHolder(typename T::value_type v) 
    { 
     ValueHolder::value = v; 
    } 
} 
+0

構造函數參數中沒有'typename'? – Nawaz

+0

不確定,但你說得對 – Geoffroy

+0

你沒有更改代碼?你不確定你應該在參數*中使用'typename'嗎? – Nawaz

4

可能。您錯過了關鍵字typename

template<typename T, typename T::value_type v> 
struct ValueHolder { ^^^^^^^^ 
    ... 

您必須通知編譯器T::value_type是一種類型。 Demo

+2

沒關係。我很困惑。 C++語法如此令人費解。 –

1

如果前綴typename的模板參數它編譯:

template<typename T, typename T::value_type v> 
struct ValueHolder { 
    const static typename T::value_type value = v; 
} 

採用typename有助於編譯器知道,在這種情況下,T::命名空間中引用的標識符value_type是一個類型,而不是一個成員函數或可變。

1

嘗試以下操作:

template<typename T, typename T::value_type v> 
struct ValueHolder { 
    const static typename T::value_type value = v; 
}; 

您的GOT爲「類型名稱」前綴爲您T:value_type ......不幸的是,只是因爲value_typeT一個typedef成員並不意味着C++的語法分析器可以告訴。它可能是一個實際的靜態數據成員,靜態方法等。因此,當訪問其他名稱空間/類中的完全限定類型時,必須以typename爲前綴。

+0

請爲我提供一個教育時刻...爲什麼downvote? – Jason

+0

噢,好吧,謝謝:-) ...我會將答案編輯到相關的代碼段,以便更清楚。 – Jason

+0

我看到你添加了一個解釋,現在+ 1ed :) –