另一个别名的模板别名

eup*_*upp 6 c++ templates c++11

我在c ++ 11中使用'using'关键字时遇到了一些问题.这段代码应该为指向另一种类型的指针创建别名.

template <typename T>
class SomeClass
{
    typedef typename std::add_pointer<T>::type pointer;

    template <typename U>
    using rebind_pointer = typename std::pointer_traits<pointer>::rebind<U>;
}

SomeClass<int> obj;
Run Code Online (Sandbox Code Playgroud)

但是在gcc 4.7中我遇到了编译错误:

typename std::pointer_traits<int*>::rebind名称template<class _Up> using rebind = _Up*,不是类型

我发现pointer_traits :: rebind本身就是一个模板别名,所以这可能是问题吗?

Tar*_*ama 9

您需要告诉编译器解析rebind为模板:

template <typename U>
using rebind_pointer = typename std::pointer_traits<pointer>::template rebind<U>;
//                                                            ^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

这是必要的,因为std::pointer_traits<pointer>它取决于模板参数(T).

有关何时以及为何需要使用该关键字的详细信息,请参阅此问题template.