我写了一个模板化函数foo
,它返回std::string
。
auto s = foo(...) << std::endl;
std::cout << s << std::endl;
有效,但
std::cout << foo(...) << std::endl;
以
失败与'operator&lt;&lt;'不匹配(操作数类型为'std :: basic_ostrea&lt; char&gt;'和'&lt;未解析的重载函数类型&gt;')
错误。
完整代码:
#include <iostream>
#include <string>
#include <iterator>
#include <vector>
#include <type_traits>
// checks if It is an iterator type
template<typename It, typename Base = std::input_iterator_tag>
struct is_iterator : public std::is_base_of<Base, typename std::iterator_traits<It>::iterator_category> {};
// dummy function that takes in iterator
template<typename It, typename = typename std::enable_if_t<is_iterator<It>::value>>
std::string foo(It it) { return "foo it"; }
int main() {
std::vector<int> v{1};
// works
auto s = foo(v.begin());
std::cout << s << std::endl;
// doesn't
std::cout << (foo(v.begin())) << std::end;
}
为什么没有作业的电话会失败?我的猜测是我的模板定义有问题,但我无法弄清楚它是什么。
答案 0 :(得分:1)
你有一个错字。改变行 -
std::cout << (foo(v.begin())) << std::end;
进入 -
std::cout << (foo(v.begin())) << std::endl;