【问题标题】:Variadic templates and functions overriding可变参数模板和函数覆盖
【发布时间】:2018-05-05 14:24:21
【问题描述】:

我想使用可变参数模板来进行此类调用:

make_set<int, double, int>("...");  

基本上这个想法是递归调用read_row()函数,只要至少有一个参数。

这里是被覆盖的函数:

template <typename __First>
void read_row(Row r){}

template <typename __First, typename... __Args>
void read_row(Row r)
{
    int index = r.size() - sizeof...(__Args);
    auto value = r.getValue<__First>(index);
    read_row<__Args...>(r);
}

template <typename... __Args>
void make_set(const char* fileName="")
{
    Parser parser(fileName);

    for(int i = 0; i < parser.rowCount(); ++i)
    {
        auto row = parser.getRow(i);
        read_row<__Args...>(row);
    }
}

但是编译器坚持递归调用是不明确的。

/Users/kirill/Desktop/TSP-EQ/TSP-EQ/tspeq/tspset/tspset.hpp:42:13: Call to 'read_row' is ambiguous

【问题讨论】:

  • 以双下划线开头的标识符保留用于实现。从技术上讲,这是未定义的行为。请发送minimal reproducible example,因为现在您的表现不足以重现该错误。另外,请从您的编译器复制/粘贴错误消息,而不是发布您的 IDE 的图片。

标签: c++ c++11 recursion variadic-templates overriding


【解决方案1】:

这是模棱两可的,因为

template <typename __First>

只要求一个模板类型参数和

template <typename __First, typename... __Args>

要求一个或多个模板类型参数。

两个或多个参数都很好(第二个是choose),但是当函数调用时只有一个参数?

解决问题的一种可能方法是在第二个版本中强加两个或多个参数。类似的东西

template <typename F>
void read_row (Row r)
 {
   // auto value = r.getValue<F>(r.size()); ???
 }

template <typename F, typename S, typename... As>
void read_row (Row r)
 {
   int index = r.size() - (1U + sizeof...(As));
   auto value = r.getValue<F>(index);
   read_row<S, As...>(r);
 }

【讨论】:

  • 我暗示这个函数是一个递归基
  • @KirillKorolev - 当然,你需要一个地壳;但是你必须清楚地写出来;答案改进了举个例子。
  • @KirillKorolev 这就是问题所在。你暗示。您没有编写编译器可以理解的代码,因此人们会以某种方式对其进行解释,从而导致误解。通过提供适当的测试用例来避免这些。
猜你喜欢
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多