模板类中的Typedef不起作用

时间:2011-04-02 17:37:11

标签: c++ class templates typedef 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;
    }
};

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

我想要发生的是“查询”将成为lamePtr&lt; U&gt; :: ptr(一个简单的值,不是typedef;)。但是,我得到了编译错误(使用gcc 4.4.3):

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

我在这里做错了什么?

2 个答案:

答案 0 :(得分:13)

someType,因为lamePtr<U>是“依赖名称”。这取决于U是否存在成员ptr,如果是,该成员是什么类型的“事物”。

当然,知道对于所有TlamePtr<T>::ptr是一种类型,但在编译的这个阶段,解析器不知道。

使用the typename keyword提示解析器它是一个类型。其余的将在编译过程的后期解决。只是一点点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;
    }
};

答案 1 :(得分:9)

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

    typename someType::ptr query;

有关详细信息,请参阅Officially, what is typename for?