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