2014-03-12 103 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) –