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

标签 c++ templates alias using forward-declaration

我需要实现如下接口(interface)

struct mutex;
struct interface
{
  //...
  mutex& getMutex();
};

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

error: conflicting declaration ‘using mutex = ’
error: ‘class mutex’ has a previous declaration as ‘class mutex’

我没有定义任何东西两次,只是声明两次,就像前向声明时一样,所以

  1. 为什么这行不通?
  2. 有没有不修改 interface 的解决方法? ?
  3. 应该如何interface被定义了吗?与 template <typename mutex>

最佳答案

  1. 它不起作用,因为前向声明 struct mutex; 告诉编译器 mutex 是一种新类型。通过 using,您随后创建了一个类型别名,这意味着它不是一个类型(如向编译器 promise 的那样),而是一个别名现有类型。

  2. 没有。

  3. 是。


可以做的是:

struct mutex : ParticularMutex {
    using ParticularMutex::ParticularMutex; // inherit constructors
};

它确实定义了一个派生自 ParticularMutex 的类型,希望它足够兼容。当然,这是一种新类型,可能会导致其他问题。

关于C++ - 前向声明和别名(使用 using 或 typedef),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18834645/

相关文章:

作为别名加入的 sql 不起作用

C++测试代码

c++ - Qt5.9.1 和 Visual Studio 2015 添加 Qt WebEngine 模块

带有 std::begin()、std::end() 问题的 C++11 自动迭代器类型

JavaScript 字符串字面量重用组件

c++ - 函数模板参数包的问题

iphone - .gdbinit 中的变量别名?

c++ - C++ 中的电子邮件验证

C++ lambda 大小

ruby-on-rails - alias_method_chain 是 alias_method 的同义词吗?