非类型模板参数,其类型取决于另一个参数

时间:2014-03-12 22:46:23

标签: c++ templates

我试图定义一个具有类型参数和非类型参数的模板函数。但是,非类型参数的类型取决于类型参数。它看起来如下:

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。上面的代码只是结构的一个例子。我知道代码本身毫无意义。

2 个答案:

答案 0 :(得分: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 :(得分:3)

几乎typename放在正确的位置。

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

此外,Pointer typedef需要公开才能生效。