未找到匹配的 C++ 模板运算符

标签 c++ templates c++11 operator-overloading iterable

我正在尝试创建一个通用的 operator<<对于 std::ostream和任何 Iterable 类型。

这是代码:

template <class T,template<class> class Iterable> inline std::ostream& operator<<(std::ostream& s,const Iterable<T>& iter){
    s << "[ ";
    bool first=false;
    for(T& e : iter){
        if(first){
            first=false;
            s << e;
        }else{
            s << ", " << e;
        }
    }
    s << " ]";
    return s;
}

不幸的是,我的运算符未找到与 vector<uint> 的匹配项并且编译器尝试匹配 operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x) .

知道如何更改要识别的过载吗?

最佳答案

你的问题的直接解决方案是 vector两种类型的模板,而不是一种,所以你想写:

template <typename... T, template <typename... > class Iterable>
inline std::ostream& operator<<(std::ostream& os, const Iterable<T...>& iter)
{
    s << "[ ";
    bool first = true; // not false
    for (const auto& e : iter) {
        // rest as before
    }
    return s << " ]";
}

这行得通,但有点不令人满意——因为有些模板是不可迭代的,而有些不是模板的是。此外,我们的解决方案实际上不需要 IterableT。那么我们写一些接受任何 Range 的东西怎么样 - 我们将 Range 定义为具有 begin()end() 的东西:

template <typename Range>
auto operator<<(std::ostream& s, const Range& range) 
-> decltype(void(range.begin()), void(range.end()), s)
{
    // as above, except our container is now named 'range'
}

如果那一般,那么你可以这样做:

template <typename T> struct is_range : std::false_type;
template <typename T, typename A>
struct is_range<std::vector<T,A>> : std::true_type;
// etc.

template <typename Range>
typename std::enable_if<
    is_range<Range>::value,
    std::ostream&
>::type
operator<<(std::ostream& s, const Range& range)    

关于未找到匹配的 C++ 模板运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28387132/

相关文章:

c++ - 我正在尝试安装 gameplay 游戏引擎,但遇到错误

c++ - 如果 'input' 是一个整数,为什么 cin.fail() 会传递 input=100a?

c++ - 如何使用 sfinae 排除定义了函数的类型?

c++ - 为什么这个模板推理失败

c++ - GNU/G++ 4.9(2.95.3 之前的版本)的 C++11 中的 string_char_traits<char>

c++ - 运算符按位左移

c++ - 如何通过 cmake 将版本详细信息添加到 .exe 或 .dll

android - 类似Android的CSS/HTML网站模板?

c++ - 如何在 C++ 中创建和使用非类型模板以及将在何处使用

c++ - 我想杀死一个 std::thread 使用它的线程对象?