簡體   English   中英

解決無符號長型/指針模糊性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM