2

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

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

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

4

1 回答 1

6

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

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

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

您可以通过插入来修复它typename

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

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

于 2010-03-28T11:42:38.903 回答