簡體   English   中英

在可變參數模板函數中對重載函數的模糊調用

[英]Ambiguous call to overloaded function in variadic template function

我正在使用可變參數模板函數,其中函數參數不是模板化類型。

我收到一個編譯錯誤:

錯誤 C2668“_TailHelper”:對重載函數的調用不明確

這是代碼片段。

template <typename HEAD>
void _TailHelper(int) {
    std::cout << typeid(HEAD).name() << std::endl;
}

template <typename HEAD, typename ... TAILS>
void _TailHelper(int x) {
    _TailHelper<HEAD>(x);
    _TailHelper<TAILS...>(x);
}


int main(){
    _TailHelper<int,double>(2);
}

兩個重載都與單個模板參數匹配,因此您必須禁用一個。 例如像這樣:

#include <iostream>    
#include <typeinfo>

template <typename T>
void TailHelper(int) { 
    std::cout << typeid(T).name() << std::endl;
}

template <typename HEAD, typename ... TAILS>
typename std::enable_if<(sizeof...(TAILS) != 0)>::type
TailHelper(int x) {
    TailHelper<HEAD>(x);        
    TailHelper<TAILS...>(x);
}

int main() {
    TailHelper<int,double>(2);
}

模棱兩可的調用來自這一行:

_TailHelper<HEAD>(x);

此調用匹配第一個函數和第二個函數,其第二個參數可以引用零個或多個模板參數。

作為遞歸的替代方法,您可以“循環”您的可變參數:

在 C++17 中:

template <typename... Ts>
void PrintTypes() {
    ((std::cout << typeid(Ts).name() << std::endl), ...);
}

在以前的版本中,它不太優雅,您可能會使用一些技巧:

template <typename... Ts>
void PrintTypes() {
    const int dummy[] = {0, ((std::cout << typeid(Ts).name() << std::endl), 0)...};
    static_cast<void>(dummy); // Avoid warning for unused variable
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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