我正在尝试学习可变参数模板。我在看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;
}
}
答案 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 {};
}