C++11 编译器混淆了类和同名类方法

C++11 compiler confused between class and a same-named class method

本文关键字:类方法 编译器 C++11      更新时间:2023-10-16

我有一个类:

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-else,我设法让编译器打印:

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 ) )

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

除了重命名类或方法之外,有没有办法明确指定我的意思是类而不是方法"反馈"?

谢谢!

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

您需要指定命名空间:

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

这样它就会知道选择类。同名的函数位于另一个类中,因此您将有一个对象来访问它。但是如果你用第二类编程,你确实会遇到这个问题。