2012-05-14 19 views
2

我在C++中重載方法時遇到了一些問題。以typedef別名爲參數重載成員方法

typedef char int8_t; 
class SomeClass{ 
public: 
… 
void Method(int8_t paramater); 
void Method(char paramater); 
}; 

由於int8_t是因爲typedef的他們char只是別名,它們可能指的是同一類型,其中超載的情況下將無法正常工作。

我想讓它們在同一時間工作?你能建議解決方案相同嗎? 注意:我不想添加模板化方法。

以下是錯誤:

Error: Multiple declaration for SomeClass::Method(char)

+3

如果編譯器和編譯器都是完全相同的簽名,編譯器會如何區分兩者? – chris

回答

0

你可能會嘗試此獲得一定程度的改善。

然而,狡猾的實現可以做這樣的事情:

typedef __special_secret_sauce int8_t; 

,然後你需要定義另一個過載int8_t。要爲int8_t定義另一個過載以與這些實現進行抗衡並且同時未將其定義爲int8_t的實現定義爲signed char,這很難。別人說這甚至不可能。

有可能存在int8_t根本不存在的實現。如果你只是定義了char的三種變體的重載,那麼你就沒有問題了。

2

... they may refer to the same type in which case overloading won’t work. I want to make them work at the same time?

好在這是不可能的(即使templates)。因爲它殺死了typedef的目的。
如果你打算在你的代碼中做到這一點,那麼它是一個代碼氣味;你可能不得不改變你的設計。

5

使用人造類型。將charint8_t中的一個包裝在結構中,並將該結構用作參數。如果實現定義int8_t,如果定義相匹配這三個中的一個,那麼正確的函數將調用

void Method(char paramater); 
void Method(signed char paramater); 
void Method(unsigned char paramater); 

+0

不幸的是,我不能,因爲我在solaris平臺上使用這個typedef int_types.h – user1393608

+0

你可以使用像這樣的:'struct faux_int8_t {int8_t x;};' – dirkgently

+0

因爲我從solaris平臺int_types.h使用typedef我不能使用上面你提到的結構。 – user1393608