如果返回值未分配给变量,则未解析的函数重载

时间:2017-11-24 12:49:22

标签: c++ templates

我写了一个模板化函数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;
}

为什么没有作业的电话会失败?我的猜测是我的模板定义有问题,但我无法弄清楚它是什么。

1 个答案:

答案 0 :(得分:1)

你有一个错字。改变行 -

std::cout << (foo(v.begin())) << std::end;

进入 -

std::cout << (foo(v.begin())) << std::endl;