C++ - 前向声明和别名(使用using或typedef)

ric*_*cab 5 c++ alias templates using forward-declaration

我需要实现以下接口

struct mutex;
struct interface
{
  //...
  mutex& getMutex();
};
Run Code Online (Sandbox Code Playgroud)

我可以using mutex = ParticularMutex在我的实现中使用直觉,但gcc告诉我:

error: conflicting declaration ‘using mutex = ’
error: ‘class mutex’ has a previous declaration as ‘class mutex’
Run Code Online (Sandbox Code Playgroud)

我没有定义任何两次,只是宣布两次,就像前面宣布的那样,所以

  1. 为什么这不起作用?
  2. 有没有修改的解决方法interface
  3. 应该怎么interface定义?用template <typename mutex>

Dan*_*rey 7

  1. 它不起作用,因为前向声明struct mutex;告诉编译器这mutex是一个新类型.有了using那么你正在创建一个类型的别名,这意味着它不是一个新的类型(如许的编译器),但一个别名到现有的类型.

  2. 没有.

  3. 是.


可以做的是:

struct mutex : ParticularMutex {
    using ParticularMutex::ParticularMutex; // inherit constructors
};
Run Code Online (Sandbox Code Playgroud)

哪个定义了一个类型,ParticularMutex从中可以很好地兼容.当然,这是一种可能导致其他问题的新类型.

  • 不过,我不明白为什么编译器应该关心。我想知道为什么没有一种方法可以转发声明说“这个名字代表 _some_ 类型。你现在不需要知道确切的定义,但你会在链接时拥有它” (3认同)