模板类中的Typedef不起作用

Mel*_*lon 8 c++ templates typedef class typename

我有以下代码的问题:

template <typename U>
class lamePtr
{
public:
    typedef U* ptr;
};

template <typename U>
class smarterPointer
{
    public:
    void funFun()
    {
        typedef lamePtr<U> someType;
        someType::ptr query;
    }
};
Run Code Online (Sandbox Code Playgroud)

如你所见,我在lamePtr中有一个typedef.在smarterPointer类里面我有一个函数funFun().我想做的是制作另一个typedef someType.直到该行,一切正常,直到我们到someType :: ptr查询行.

我想要发生的是"查询"将成为lamePtr <U> :: ptr(一个简单的值,而不是typedef;).但是,我得到编译错误(使用gcc 4.4.3):

temp.cpp: In member function ‘void smarterPointer<U>::funFun()’:
temp.cpp:15: error: expected ‘;’ before ‘query’
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

Lig*_*ica 14

someType,作为lamePtr<U>"依赖名称".这取决于U是否有成员ptr,如果是,成员是什么样的"事物".

当然,知道,对于所有人来说T,lamePtr<T>::ptr是一种类型,但在这个编译阶段,解析器并不知道.

使用typename关键字,以提示这是一个类型的解析器.其余的将在编译过程的后期解决.只是一点点C++怪癖.

template <typename U>
class lamePtr
{
public:
    typedef U* ptr;
};

template <typename U>
class smarterPointer
{
    public:
    void funFun()
    {
        typedef lamePtr<U> someType;
        typename someType::ptr query;
    }
};
Run Code Online (Sandbox Code Playgroud)


ken*_*ytm 9

您需要typename关键字来表示这someType::ptr是一种类型.

    typename someType::ptr query;
Run Code Online (Sandbox Code Playgroud)

官方,什么是类型名呢?细节.