2014-03-12 141 views
0

我想要定義一個模板函數誰有一個類型參數和一個非類型的參數。但是,非類型參數的類型取決於類型參數。它看起來像如下:非類型的模板參數,其類型取決於另一個參數

template<typename T> 
class A{ 
    typedef T* Pointer; 
}; 

template<typename T, A<typename T>::Pointer P> 
T fun(){ 
    return *P; 
} 

int main(){ 
    fun<int, (int*)0>(); 
} 

如果我編譯代碼,編譯器會抱怨:

test.cpp:6:34: error: template argument 1 is invalid 
template<typename T, A<typename T>::Pointer P> 
           ^
test.cpp:6:45: error: expected ‘>’ before ‘P’ 
template<typename T, A<typename T>::Pointer P> 
              ^

我應該怎麼做才能讓我的代碼工作?謝謝!

PS。上面的代碼只是結構的一個例子。我知道代碼本身是沒有意義的。

回答

3

差不多typename放在正確的地方。

template<typename T, typename A<T>::Pointer P> 

此外,Pointertypedef需求是公共爲了這個工作。

+0

謝謝!你能解釋一下或者給出一個關於在這種情況下爲什麼需要'typename'的參考嗎? – james

+1

http://stackoverflow.com/a/8584507/481267 – Brian

4

當您解決語法和訪問控制它的工作原理:

template<typename T> 
class A 
{ 
public:           // must be accessible! 
    typedef T* Pointer; 
}; 

template<typename T, typename A<T>::Pointer P>  // like this 
T fun() 
{ 
    return *P; 
} 

int main() 
{ 
    fun<int, (int*)0>(); 
} 
+1

[Live demo](http://ideone.com/zf7kFM) –