可变参数模板函数中对重载函数的歧义调用

时间:2020-10-05 10:09:48

标签: c++ c++11

我正在使用可变参数模板函数,其中函数参数不是模板化类型。

我遇到了编译错误:

错误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);
}

3 个答案:

答案 0 :(得分:4)

两个重载都与单个模板参数匹配,因此必须禁用一个。例如这样的

#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);
}

答案 1 :(得分:0)

歧义的呼叫来自此行:

_TailHelper<HEAD>(x);

此调用将第一个功能与第二个功能匹配,第二个功能的第二个参数可以引用或更多模板参数。

答案 2 :(得分:0)

作为递归的替代方法,您可以“遍历”可变参数:

在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
}
相关问题