2013-09-16 99 views
3

我需要實現以下接口C++ - 向前聲明和別名(使用或類型定義)

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>

回答

5
  1. 它不起作用,因爲向前聲明struct mutex;告訴編譯器mutex是一個新類型。隨着using你然後創建一個類型別名,這意味着它不是一個新的類型(如承諾的編譯器),但一個現有類型的別名。

  2. 是。


可能做的是什麼:

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

這確實定義從ParticularMutex派生的類型是不夠有望兼容。當然,這是一種可能導致其他問題的新類型。

+1

不過,我不明白爲什麼編譯器應該關心。我想知道爲什麼沒有一種方法可以轉發宣稱「這個名稱代表_some_類型」的聲明,現在你不需要知道確切的定義,但是你可以在鏈接時獲得它「 – ricab

+0

@ricab編譯器關心因爲這是標準要求的。不管它是否有用,或者是否應該有某種方式來轉發 - 聲明類型別名,都是一個不同的問題。坦率地說,一個模板參數就是這樣的:它告訴'interface'你稍後會提供一些類型(或類型別名)。 –

+0

@ricab我用一個可能的解決方案更新了答案,檢查它是否適用於您。 –

0
  • 首先你說mutex是一個特定的類類型。然後稍後你說「哦,等待,mutex是不是它自己的類型,這是真的這種其他類型而不是」。編譯器在這種情況下不知道該怎麼做。

  • 替換struct mutext與使用,它應該只是工作(我不完全是最新的C + + 11使用)。

  • 如果您希望能夠支持多個互斥體實現,您可能希望將該接口設置爲模板(或使用虛擬互斥體抽象接口來虛擬地決定調用哪個互斥體實現)。

+0

謝謝,關於2:我可能不夠明確,但我的意思是「是否有一種解決方法,無需修改_file_接口'_和__前向聲明? – ricab

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

accepted answer作品的add()而不是連接();後者需要額外的static_cast

我相信在某些情況下,兩種方法都有其優點。