[英]Resolve unsigned long / pointer ambiguity
我們的舊代碼使用RogueWave庫。 我正在嘗試從0文字構造RWTime對象。 但是,我所做的任何事情似乎都沒有效果,並且編譯器仍然有兩個構造函數可供選擇:
error: call of overloaded 'RWTime(int)' is ambiguous
_time(static_cast<unsigned long>(0))
^
note: candidates are:
RWTime::RWTime(const tm*, const RWZone&)
RWTime(const struct tm* ptm, const RWZone& zone = RWZone::local());
^
RWTime::RWTime(long unsigned int)
RWTime(unsigned long s)
^
constexpr RWTime::RWTime(const RWTime&)
class RW_DEPRECATE_TYPE("Use RWDateTime instead") RW_TOOLS_SYMBOLIC RWTime
^
constexpr RWTime::RWTime(RWTime&&)
我想使用unsigned long
構造函數,但我似乎無法實際傳遞unsigned long。 我試過了:
_time(static_cast<unsigned long>(0))
_time((unsigned long)0)
_time(0UL)
_time(0)
但沒有效果。 也許問題在於指針具有uintptr_t
類型,這與size_t
類型同義,而size_t
類型與unsigned long
同義。 然后實際上有兩個構造函數的unsigned long
。
編輯:我檢查了RWTime類文檔,他們提到了問題:“編譯器可以將0解析為整數或指針。由於還有一個構造函數需要一個指針(構造struct tm
),如果要構造一個unsigned long
值0開始的時間,您必須明確:
RWTime earlyTime((unsigned long)0);
但是,由於某種原因,它對我不起作用(使用c ++ 11)。
如果可以使用c11,則不能使用nullptr和nullptr_t覆蓋問題:當value為0(或NULL也為0)時,編譯器可以在指針和int函數之間進行選擇。
您必須定義一個接受nullptr_t的新函數,以避免產生歧義:
RWTime::RWTime( std::nullptr_t np)
並且,當然,對空指針使用std::nullptr
正如您指出的那樣,無法更改庫代碼,我提出了第二種解決方案:定義一個中間變量,以向編譯器提供必須選擇哪個函數的線索
unsigned long tmp = 0;
_time(tmp);
可以給第二個參數另一種方法:
_time(0, RWZone::local());
如果您可以接受,則可以在構造函數中RWZone
的默認值:
RWTime(const struct tm* ptm, const RWZone& zone = RWZone::local());
這樣它顯示為:
RWTime(const struct tm* ptm, const RWZone& zone);
然后,不能這樣做,因為RWZone
參數將丟失。
當然,您可以添加一個靜態方法,該方法允許您創建一個僅包含const struct tm*
的RWTime
對象,如下所示:
static RWTime create(const struct tm* ptm) { return RWTime(ptr, RWZone::local()); }
原來,我畢竟是看錯了一段代碼。
_time(0UL)
奇跡般有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.