【问题标题】:Ambiguous call to overloaded function in variadic template function在可变参数模板函数中对重载函数的模糊调用
【发布时间】:2020-10-05 10:09:48
【问题描述】:

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

我得到一个编译错误:

错误 C2668 '_TailHelper':对重载函数的模糊调用

这里是代码sn-p。

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

【问题讨论】:

  • 你忘了解释你是如何编译的,并完整引用了编译器的错误。
  • 保留以_ 后跟大写字母开头的名称。
  • _TailHelper&lt;HEAD&gt;(x); 应该调用什么?你的编译器不知道,我们也不知道
  • 当然是模棱两可,_TailHelper&lt;int&gt;匹配两个模板,TAILS可以为空。
  • 另外,请不要在 MACRO_NAMES 以外的任何地方使用 SHOUT,也不要使用宏。如果您想要一个使模板参数从其他名称中脱颖而出的约定,请尝试例如T_Head 和 T_Tails 之类的,但不是 ALL_CAPS。

标签: c++ c++11


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    模棱两可的调用来自这一行:

    _TailHelper&lt;HEAD&gt;(x);

    此调用匹配第一个函数和第二个函数,其第二个参数可以引用零或多个模板参数。

    【讨论】:

      【解决方案3】:

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

      在 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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多