为什么可变参数模板函数收到“没有匹配的函数来调用..”?

时间:2019-02-08 03:06:19

标签: c++ c++11

我正在尝试学习可变参数模板。我在看youtube video,那里的主人举了一些例子。我尝试复制该示例并尝试进行编译,但是出现错误,提示“没有匹配函数可调用to_string

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

template <class T>
std::string to_string_impl(const T &val) {
  std::stringstream ss;
  ss << val;
  return ss.str();
}

template <class t>
std::vector<std::string> to_string() {
  return {};
}

template <typename P1, typename... Param>
std::vector<std::string> to_string(const P1 &p1, const Param &... param) {
  std::vector<std::string> ret;
  ret.push_back(to_string_impl(p1));

  const auto remainder = to_string(param...); // <----- compiler error coming from this line
  ret.insert(ret.begin(), remainder.begin(), remainder.end());

  return ret;
}

int main() {
  std::vector<std::string> vec = to_string("Hello", 9.0);
  for (auto v : vec) {
    std::cout << v << std::endl;
  }
}

1 个答案:

答案 0 :(得分:1)

错误是

...
prog.cpp:23:35: error: no matching function for call to ‘to_string()’
   const auto remainder = to_string(param...);
                          ~~~~~~~~~^~~~~~~~~~
prog.cpp:14:26: note: candidate: template<class t> std::vector<std::__cxx11::basic_string<char> > to_string()
 std::vector<std::string> to_string() {
                          ^~~~~~~~~
prog.cpp:14:26: note:   template argument deduction/substitution failed:
prog.cpp:23:35: note:   couldn't deduce template parameter ‘t’
   const auto remainder = to_string(param...);
                          ~~~~~~~~~^~~~~~~~~~
...

您已将基本情况函数定义为

template <class t>
std::vector<std::string> to_string() {
  return {};
}

错误是无法推导模板参数t,因为它不用作参数,并且您没有明确指定它(例如to_string<int>(),您可以无论如何都不要在这里做)。摆脱它。

std::vector<std::string> to_string() {
  return {};
}