0

operator>>()「ベース」タイプとコンテナタイプのオーバーロードが必要です。これは私がこれまでに持っているものです:

typedef uintmax_t my_t;
template <typename T>
std::istringstream &operator>>(std::istringstream &iss, T &v)
{
    static my_t um = 6009;
    v = um++;
    return iss;
}

template <template <class> class C, typename T>
std::istringstream &operator>>(std::istringstream &iss, C<T> &c)
{
    for (typename C<T>::iterator it = c.begin(); it != c.end(); ++it)
        iss >> *it;
    return iss;
}

int main()
{
    std::vector<uint32_t> vi(3);
    std::istringstream iss;
    iss >> vi;
    for (std::vector<uint32_t>::iterator it = vi.begin(); it != vi.end(); ++it)
        std::cout << *it << std::endl;
}

これは、GCC で期待どおりにコンパイルおよび実行されますが、VS2015 ではコンパイルされません。後者>>は、ステートメント内の演算子をiss >> vi;最初の基本型のオーバーロードと一致させ、他のコンパイル エラーを引き起こします。GCC および VS2015 でコンパイルされる非コンテナー タイプのテンプレートとコンテナー タイプのテンプレートを作成するにはどうすればよいですかoperator>>()(コンテナー タイプごとに特化する必要はありません)。

4

1 に答える 1