代码之家  ›  专栏  ›  技术社区  ›  Nate

gcc返回嵌套类的错误

  •  2
  • Nate  · 技术社区  · 15 年前

    我正在尝试使用嵌套类的完全限定名,如下所示,但编译器正在犹豫!

    template <class T> class Apple {
        //constructors, members, whatevers, etc...
    public:
        class Banana {
        public:
            Banana() {
                //etc...
            }
            //other constructors, members, etc...
        };
    };
    
    template <class K> class Carrot{
    public:
        //etc...
        void problemFunction()
        {
            Apple<int>::Banana freshBanana = someVar.returnsABanana(); //line 85
            giveMonkey(freshBanana);  //line 86
        }
    };
    

    我的问题是,编译器说:

    Carrot.h:85: error: expected ';' before 'freshBanana'
    Carrot.h:86: error: 'freshBanana' was not declared in this scope
    

    我以为使用完全限定名可以访问这个嵌套类?它可能会打我的脸,但我在这里到底看不到什么??

    1 回复  |  直到 15 年前
        1
  •  6
  •   Johannes Schaub - litb    15 年前

    这可能不是你在代码中所做的。错误消息看起来是这样的

    Apple<K>::Banana freshBanana = someVar.returnsABanana();
    

    编译器在分析代码之前必须知道名称是否命名类型。在这种情况下,当它解析时,它不知道是什么类型 K 现在还不知道 Apple<int> 没有嵌套类)。所以它假设 Apple<K>::Banana 不是类型。但是,它是一个表达式,后面需要一个运算符或分号。

    你可以通过插入 typename :

    typename Apple<K>::Banana freshBanana = someVar.returnsABanana();
    

    它断言名称是一个类型,然后编译器知道将其解析为一个声明。