我带了3个版本的代码,第一个导致编译错误,第二个和第三个成功编译。



代码1:

我创建的类是Bottom中的嵌套类,它是模板类Middle中的嵌套类

template <class>
struct Top {
    struct Middle {
        struct Bottom {};
    };
    void useclass(Middle::Bottom);
};


这段代码给出了一个错误:

main.cpp:6:27: error: 'Top::Middle::Bottom' is not a type
 void useclass(Middle::Bottom);
                       ^


代码2:

与代码1相似,但Top是普通类(非模板)

struct Top {
    struct Middle {
        struct Bottom {};
    };
    void useclass(Middle::Bottom);
};


此代码已成功编译,没有任何错误

代码3:

与代码1相似,但方法Top采用useclass代替Middle

template <class>
struct Top {
    struct Middle {
        struct Bottom {};
    };
    void useclass(Middle);
};


该代码也已成功编译



请告诉我:


为什么无法编译代码1,哪个C ++规则阻止其被编译?
有什么方法可以将像Bottom这样的模板类的嵌套类中的嵌套类用作类型?

最佳答案

我只是把它弄清楚了,我需要在代码1中的typename之前放置Middle::Bottom,它将成功编译。

template <class>
struct Top {
    struct Middle {
        struct Bottom {};
    };
    void useclass(typename Middle::Bottom);
};


附言我仍然希望获得更多详细信息的答案,例如为什么编译器不能将Middle::Bottom识别为没有关键字typename的类型?

09-08 10:17