9

我需要实现以下接口

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

4 回答 4

11
  1. 它不起作用,因为前向声明struct mutex;告诉编译器这mutex是一种新类型。然后,using您将创建一个类型alias,这意味着它不是类型(正如对编译器所承诺的那样),而是现有类型的别名。

  2. 不。

  3. 是的。


可以做的是:

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

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

于 2013-09-16T18:22:44.143 回答
1

在类似的情况下(使用 JNI 抽象),这是我所做的:

JNI 不知道的文件MyObject.h

class PlatformObject; // forward declaration
struct MyObject {
        int accumulator;
        PlatformObject* platformObj;
};

JNI 感知文件jniBridge.cpp

#include <jni.h>
#define PlatformObject _jobject
#include "MyObject.h"

void attach(MyObject& obj, jobject parent) {
    obj.platformObj = env->GetObjectField(parent, child_FieldID);
}

void add(MyObject& obj, int k) {
    accumulator += k;
    env->CallVoidMethod(obj.platformObj, add_MethodID, k);
}

接受的答案适用于add()但不适用于attach();后者需要额外的static_cast 。

我相信在某些情况下,这两种方法都有其优势。

于 2016-01-27T10:54:05.933 回答
0
  • 首先,您说的mutex是特定的类类型。然后稍后你会说“哦等等,mutex不是它自己的类型,它实际上是另一种类型”。在这种情况下,编译器不知道该怎么做。

  • 替换struct mutext为 using ,它应该可以正常工作(我对 C++11 的使用并不完全是最新的)。

  • 如果您希望能够支持多个互斥体实现,您可能希望使接口成为模板(或使用互斥体抽象接口来虚拟决定调用哪个互斥体实现)。

于 2013-09-16T18:22:21.957 回答
0

好吧,您通常可以通过在其中一个标头中添加一个存根声明来解决这个问题ParticularMutex。就像是:

namespace foreignlib {
    namespace foreignsublib {
        class ParticularMutex;
    }
}

然后在您的一般标题中:

namespace ourlib {
    using mutex = foreignlib::foreignsublib::ParticularMutex;
}

这可以正常工作并且可以快速解析和编译。优势:阅读您的一般标题的人mutex都知道,这到底代表什么。缺点:您不能编写与互斥锁无关的库,稍后您可以使用该using指令放入一个或另一个互斥锁。如果您想要或需要这样做,C++ 之神希望您改用模板。但这些都是以自己的价格...

于 2021-01-09T18:54:56.837 回答