2014-01-15 26 views
0

我有一个类:C++编译器的11类和同名类方法之间混淆

class Feedback 
: public Message 
{ 
    // Do some stuff 
}; 

而且别的地方,我有一个处理类:

class EpisodicHandler 
{ 

    void Feedback () {} 

}; 

现在,另一个类,我想:

if (std::shared_ptr<Feedback> feedback = std::dynamic_pointer_cast<Feedback>(message)) 
... 

15分钟,所有我能拿出来的编译器是:

error: no matching function for call to ‘dynamic_pointer_cast(std::shared_ptr<Message>&)’ 

其中,消息是抽象基类:

class Message 
{ 
    public: 

    virtual void setRaw(const std::string) = 0; 

    virtual std::string Bytes(void) const = 0; 

    virtual bool store(void) = 0; 

    virtual ~Message(){ }; 

}; 

洗牌一些if-别人的身边,我设法让编译器打印:

error: expected a type, got ‘EpisodicHandler::Feedback’ 
error: no matching function for call to ‘dynamic_pointer_cast(std::shared_ptr<Message>&)’ 
    else if (std::shared_ptr<Feedback> feedback = std::dynamic_pointer_cast<Feedback>(message)) 

这似乎的bizzare我,因为我没有指定EpisodicHandler :: Feedback! 该方法通过继承另一个导入的类可见。

除了重命名类或方法,是有办法明确规定,我指的是类,而不是方法“反馈”?

谢谢!

PS:编译器是gcc(Debian的4.8.2-1)4.8.2

+0

您能否给一些更多的信息,即什么是'message'对象的样子,所以这个问题可以重现? – xis

+0

@晓歌苏嗨!我已添加ABC消息。没有什么真正复杂的,它只是许多类继承的ABC。当试图向下转换它们时,除反馈外,它工作正常,因为编译器似乎无法区分类反馈和EpisodicHandler :: Feedback –

回答

1

你需要指定命名空间:

if (std::shared_ptr<::Feedback> feedback = ... 

这样,它就会知道选择类。同名的函数在其他类中,所以你需要一个对象来访问它。但是,如果你正在编写第二课程,你确实会遇到这个问题。

+1

嗨,谢谢你的回答。我担心即使使用名称空间它仍然存在问题,但是您刚才告诉我为什么,因为if-else语句所在的类从继承自EpisodicHandler的类继承。非常感谢 !! –