【问题标题】:Typedef inside template class doesn't work模板类中的 Typedef 不起作用
【发布时间】:2011-07-28 08:10:02
【问题描述】:

我对以下代码有疑问:

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::ptr (一个简单的值,而不是 typedef ;)。但是,我得到编译错误(使用 gcc 4.4.3):

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

我在这里做错了什么?

【问题讨论】:

标签: c++ class templates typedef typename


【解决方案1】:

someType,因为lamePtr&lt;U&gt; 是“从属名称”。这取决于U 是什么,是否有成员ptr,如果有,该成员是什么“东西”。

当然,知道对于所有TlamePtr&lt;T&gt;::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;
    }
};

【讨论】:

    【解决方案2】:

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

        typename someType::ptr query;
    

    详情请见Officially, what is typename for?

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多