2013-05-10 54 views
1

我通过网络搜索了一个没有找到任何解释为什么会发生以下事件。如何从封闭模板类访问嵌套类的方法和字段?

例如,有一个模板类用嵌套类嵌套。

在Enclosing类中,有一种方法应该创建一个嵌套类的实例并使用它的字段和方法。

在下面的代码,有一个如何我试图做到这一点的模型:

template<typename T, typename S> 
class Enclosing{ 
public: 
    class Nested; 
    Nested foo(); 
}; 

template<typename T, typename S> 
class Enclosing<T,S>::Nested{ 
public: 
    T field; 
    void some_method(); 
    friend class Enclosing; // instead of this line I also tried: 
           // friend class Enclosing<T,S> 
           // and it didn't work either 
}; 

template<typename T, typename S> 
typename Enclosing<T,S>::Nested Enclosing<T,S>::foo(){ 
    Nested nes; 
    nes.some_method;   // the problem appears here 
    return enc; 
} 

的问题是:

当我在写nes.some_method,没有环境的我尝试过(VS2010,日食),在我输入“nes。”之后,并没有向我提供任何选项。我好像“内斯”根本就不是这个阶级的典范。

如何从封闭模板类访问嵌套类的方法和字段?

回答

5

这条线:

Nested nes(); 

不创建nes类型的对象,而是声明的函数它没有参数和返回Nested类型的对象。我怀疑这是你的问题的根源,而不是friend声明。只是删除对括号nes后:

Nested nes; 

另外,在C++ 11你可以这样做:

Nested nes{}; 

编辑:

固定上述错误之后,它仍然似乎你的程序不能正确编译&链接 - 怀疑是因为同样的问题。我可以从你的代码中发现,some_method()成员函数的定义仍然缺失,这可能是链接器拒绝为程序创建可执行文件的原因。

+0

我真的很想知道它是什么导致人们频繁发生此错误。我真的永远都不会记得这样做,但有人几乎每天都会发布这个消息。 – 2013-05-10 15:42:55

+0

@RyanWitmer类的默认构造函数不接受任何参数,所以初学者通常会误解他们在实例化对象时调用默认构造函数。它的语法也类似于调用专门的构造函数,这增加了混淆。 – 0x499602D2 2013-05-10 15:44:14

+0

我只是试图删除括号,它仍然不起作用。 – Grinch 2013-05-10 15:57:18

0

这里:

Nested nes(); 

你不是打电话的Nested默认的构造函数,而是声明名为nes功能,通过值取0参数和返回Nested类的一个实例。这被称为Most Vexing Parse。删除参数以使代码正常工作。

这是一个工作demo