2011-03-27 124 views
2

目前,我试图让下面的代码进行编译:外部类内部类 - 实例化内部类作为外部类的成员

terminallog.hh

#ifndef TERMINALLOG_HH 
#define TERMINALLOG_HH 

#include <string> 
#include <sstream> 
#include <iostream> 

class Terminallog { 
public: 

    Terminallog(); 
    virtual ~Terminallog();  

    class Warn { 
    public: 
     Warn(); 

    private: 
     bool lineended; 
    }; 
    friend class Terminallog::Warn; 

protected: 

private: 
    Warn warn;  

}; 

terminallog.cc

// stripped code 

Terminallog::Terminallog() { 
    Warn this->warn(); 
} 

Terminallog::Warn::Warn() { 
    this->lineended = true; 
} 

//stripped code 

那么,正如你可能猜到alredy,它的失败;-)。我的编译器说:

g++ src/terminallog.cc inc/terminallog.hh -o test -Wall -Werror 
In file included from src/terminallog.cc:8: 
src/../inc/terminallog.hh:56: error: declaration of ‘Terminallog::Warn Terminallog::warn’ 
src/../inc/terminallog.hh:24: error: conflicts with previous declaration ‘void Terminallog::warn(std::string)’ 

这让我没有选择权。我显然做错了,但我不知道如何解决这个问题。我会很感激任何提示。

在此先感谢

ftiaronsem

+0

阅读您的错误信息 - 你不发布正确的代码 - 你有一个'警告warn'成员变量和一个'警告无效(的std :: string)'成员函数,将其重命名 – Erik 2011-03-27 17:19:17

+0

之一@埃里克。 Uups,完全正确,并且非常令人印象深刻;-)。这个班里有更多的代码,我剥夺了。非常感谢您指出这一点。 – ftiaronsem 2011-03-27 17:26:04

回答

2

Warn this->warn();是无效的C++语法 - 如果你想初始化warn成员,使用初始化列表(你不需要在这种情况下 - 默认的构造函数被隐含地称为!)。

Terminallog::Terminallog() : warn() 
{ 
    // other constructor code 
} 


// note that `Warn::Warn()` is invoked implicitly on `wake`, so 

TerminalLog::Terminallog() {} 

// would be equivalent 
+0

非常感谢您的回答。这非常有趣。我如何从另一个C++文件访问内部类的方法?我计划做这样的事情:Terminallog tlog(); tlog.Warn.PubMethod();来自其他cpp文件。在此先感谢 – ftiaronsem 2011-03-27 17:28:07

+0

哈哈,你已经在你的答案中写道。我刚刚阅读了关于初始化列表的教程,然后我注意到了。非常感谢你。你真的值得很快达到10k点;-) – ftiaronsem 2011-03-27 18:18:54

+0

谢谢,在这上面工作;-) – 2011-03-27 18:44:56