c++ - 父类(super class) operator() 错误 - 不明确

标签 c++ overloading ambiguous

我正在尝试使用 C++11 定义一个可以存储多个 std::function<> 的类并根据参数类型调用它们,类似于重载决策。

我为“重载”函数应支持的每个函数签名声明一个基类:

template <typename R, typename... A>
struct overload;

template <typename R, typename... A>
struct overload<R(A...)>
{
  typedef std::function<R(A...)> F;
  F f_;
  overload(F f): f_(f) {}
  R operator()(A... a)
  {
    return f_(a...);
  }
};

template <typename... T>
struct overloaded_function : public overload<T>...
{
  overloaded_function(T... t): overload<T>(t)... {}
};

int main()
{
  overloaded_function<void(float), void(int, int)> f([](float){}, [](int, int){});
  f(1.F);  // build error
  f(2, 3); // build error
  return 0;
}

构建错误:(Visual Studio 2013)

"overload::operator() [with R=void, A=]" is ambiguous c:\Users\benj7280\Documents\kernel_builder\src\main.cpp 39 5 kernel_builder

我不明白运算符为何会模棱两可,因为函数具有完全不同的签名。当我完全删除模板时,仅使用具体类,以及当我替换 operator() 时,错误完全相同。使用命名成员函数重载。

最佳答案

您需要使用 using 包含基类 operator()。但是,我不知道如何使用参数包来做到这一点,所以希望其他人可以参与并回答这个问题。

我能做的是重做你的结构,让它一直线性继承,每次重载只需要使用下一个:

template <typename... T>
struct overloads
{
    // need this one so that the last overload has 
    // something to "using". If you have an overload for void(),
    // that one will hide this one. If you don't, and call f(),
    // this won't compile... which is fine.
    void operator()();
};

template <typename R, typename... A, typename... T>
struct overloads<R(A...), T...>
: overloads<T...>
{
  typedef std::function<R(A...)> F;
  F f_;

  template <typename... Fs>
  overloads(F f, Fs... fs)
  : overloads<T...>(fs...)
  , f_(f)
  {}

  using overloads<T...>::operator();

  R operator()(A... a)
  {
    return f_(a...);
  }
};

template <typename... T>
struct overloaded_function : public overloads<T...>
{
  overloaded_function(T... t)
  : overloads<T...>(t...)
  { }
};

现在您的 f(1.F)f(2, 3) 调用都可以编译,因为现在所有的重载都是……可重载的。

关于c++ - 父类(super class) operator() 错误 - 不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26555109/

相关文章:

c++ - 在 C++ 中将 (argc, argv) 变量作为 (argv, argc) inside main inside 传递给函数

c++ - Function operator= 必须是成员函数

c++ - 比较链表,C++,顺序相同但可以不同

c++ - 存在引用和值重载时出现不明确的函数调用

c++ - 重载运算符 '>>' 的使用不明确(操作数类型为 'istream'(又名 'basic_istream<char>')和 'MyIncreEx')

c++ - 传递一个 const 指针

c# - 无法解析已从 C# 重写和重载的 F# 方法

c++ - 是否允许编译器在重载解析期间选择 const ref 而不是 ref?

java - Java 中的 'ambiguous type' 错误是什么?

c# - 需要参数命名以防止外观相同的参数列表出现歧义