第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

請(qǐng)問工作在返回類型但不作為模板參數(shù)的SFINAE

請(qǐng)問工作在返回類型但不作為模板參數(shù)的SFINAE

C++
哆啦的時(shí)光機(jī) 2019-08-01 13:01:16
工作在返回類型但不作為模板參數(shù)的SFINAE我已經(jīng)用了很多次SFINAE的成語,我習(xí)慣了把我的std::enable_if<>在模板參數(shù)中,而不是在返回類型中。然而,我遇到了一些瑣碎的情況,它不起作用,我不知道為什么。首先,這是我的主要:int main(){     foo(5);     foo(3.4);}下面是foo觸發(fā)錯(cuò)誤:template<typename T,          typename = typename std::enable_if<std::is_integral<T>::value>::type>auto foo(T)     -> void{     std::cout << "I'm an integer!\n";}template<typename T,          typename = typename std::enable_if<std::is_floating_point<T>::value>::type>auto foo(T)     -> void{     std::cout << "I'm a floating point number!\n";}下面是一段可以正常工作的代碼:template<typename T>auto foo(T)     -> typename std::enable_if<std::is_integral<T>::value>::type{     std::cout << "I'm an integrer!\n";}template<typename T>auto foo(T)     -> typename std::enable_if<std::is_floating_point<T>::value>::type{     std::cout << "I'm a floating point number!\n";}我的問題是:為什么第一次執(zhí)行foo觸發(fā)該錯(cuò)誤,而第二個(gè)錯(cuò)誤不觸發(fā)?main.cpp:14:6: error: redefinition of 'template<class T, class> void foo(T)'  auto foo(T)       ^main.cpp:6:6: note: 'template<class T, class> void foo(T)' previously declared here auto foo(T)       ^main.cpp: In function 'int main()':main.cpp:23:12: error: no matching function for call to 'foo(double)'      foo(3.4);             ^main.cpp:6:6: note: candidate: template<class T, class> void foo(T)  auto foo(T)       ^main.cpp:6:6: note:   template argument deduction/substitution failed:main.cpp:5:10: error: no type named 'type' in 'struct std::enable_if<false, void>'           typename = typename std::enable_if<std::is_integral<T>::value>::type>           ^編輯 :工作代碼和錯(cuò)誤碼.
查看完整描述

3 回答

?
喵喔喔

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊

你應(yīng)該看看14.5.6.1 Function template overloading(C+11標(biāo)準(zhǔn))其中定義了函數(shù)模板的等效性。簡而言之,不考慮默認(rèn)模板參數(shù),因此在第一種情況下,相同的函數(shù)模板定義了兩次。在第二種情況下,有表達(dá)式引用返回類型中使用的模板參數(shù)(同樣參見14.5.6.1/4)。由于這個(gè)表達(dá)式是簽名的一部分,您將得到兩個(gè)不同的函數(shù)模板聲明,因此SFINAE有機(jī)會(huì)工作。



查看完整回答
反對(duì) 回復(fù) 2019-08-02
?
千萬里不及你

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊

模板中的值工作:

template<typename T,
         typename std::enable_if<std::is_integral<T>::value, int>::type = 0>auto foo(T)
    -> void{
    std::cout << "I'm an integer!\n";}template<typename T,
         typename std::enable_if<std::is_floating_point<T>::value, int>::type = 0>auto foo(T)
    -> void{
    std::cout << "I'm a floating point number!\n";}




查看完整回答
反對(duì) 回復(fù) 2019-08-02
  • 3 回答
  • 0 關(guān)注
  • 464 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)