Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2017 如何展开整数_序列?_Visual Studio 2017_C++_Templates_Sequence_Expansion_Variable Templates - Fatal编程技术网

Visual studio 2017 如何展开整数_序列?

Visual studio 2017 如何展开整数_序列?,visual-studio-2017,c++,templates,sequence,expansion,variable-templates,Visual Studio 2017,C++,Templates,Sequence,Expansion,Variable Templates,我有一个函数如下所示: template <typename T, std::size_t... I> std::ostream& vector_insert(std::ostream& lhs, const char* delim, const T& rhs, std::index_sequence<I...>) { std::ostream_iterator<float> it(lhs, delim); ((*it

我有一个函数如下所示:

template <typename T, std::size_t... I>
std::ostream& vector_insert(std::ostream& lhs, const char* delim, const T& rhs, std::index_sequence<I...>) {
    std::ostream_iterator<float> it(lhs, delim);

    ((*it++ = at(rhs, I)), ...);
    return lhs;
}
我尝试过的其他事情有:

  • *it++=at(rhs,I…)
  • *it++=at(rhs,I).
  • (*it++=at(rhs,I))…
  • 他们都给了我一个错误:

    错误C3520:
    I
    :必须在此上下文中展开参数包

    我如何扩展这个东西

    编辑:


    <>这似乎是一个bug。

    这看起来像是VisualC++的编译器错误。除了简化扩展参数包的表达式之外,我不知道有什么简单的解决方法。转换为递归方法似乎可以可靠地解决这个问题。例如:

    #include <array>
    #include <iostream>
    #include <iterator>
    
    template <typename T>
    const auto& at(const T& v, size_t i) { return v[i]; }
    
    // End of recursion
    template<class T>
    void vector_insert_impl(std::ostream_iterator<int> &, const char*, const T&)
    {}
    
    // Recursion case
    template<class T, std::size_t N, std::size_t... I>
    void vector_insert_impl(std::ostream_iterator<int> & iter, const char* delim, const T&rhs)
    {
        *iter++ = at(rhs, N);
    
        // Continue the recursion
        vector_insert_impl<T, I...>(iter, delim, rhs);
    }
    
    template <typename T, std::size_t... I>
    std::ostream& vector_insert(std::ostream& lhs, const char* delim, const T& rhs, std::index_sequence<I...>) 
    {
        std::ostream_iterator<int> it(lhs, delim);
    
        // Call the recursive implementation instead
        vector_insert_impl<T, I...>(it, delim, rhs);
    
        return lhs;
    }
    
    int main() {
        std::array<int, 5> v = { 1, 2, 3, 4, 5 };
        vector_insert(std::cout, " ", v, std::make_index_sequence<v.size()>());
    }
    
    #包括
    #包括
    #包括
    模板
    const auto&at(const T&v,size_T i){return v[i];}
    //递归结束
    模板
    void vector_insert_impl(std::ostream_迭代器&,const char*,const T&)
    {}
    //递归情况
    模板
    void vector\u insert\u impl(std::ostream\u迭代器和iter、const char*delim、const T和rhs)
    {
    *iter++=at(rhs,N);
    //继续递归
    向量插入(iter、delim、rhs);
    }
    模板
    std::ostream&vector_insert(std::ostream&lhs,const char*delim,const T&rhs,std::index_序列)
    {
    std::ostream_迭代器it(lhs,delim);
    //改为调用递归实现
    向量插入(it、delim、rhs);
    返回lhs;
    }
    int main(){
    数组v={1,2,3,4,5};
    向量插入(std::cout,“,v,std::make_index_sequence());
    }
    

    这里,参数包
    I
    仅在提供VC++没有问题的模板参数的上下文中进行扩展。

    而不是downvoter,但是提供一个w/a在线编译器可能会帮助我们有一个更好的开始。@tadman
    *it++
    只是计算为
    it
    ,在这种情况下,因为
    *
    ++
    ostream\u迭代器上是没有操作的。@tadman这就是
    ostream\u迭代器的作用。把东西推到
    ostream
    (比如
    std::cout
    )就像它是一个范围。看起来像是MSVC编译器的bug。无法使用gcc 8.3复制。我已经接受了它,因为它非常适合我的玩具示例。在这里,我试图在这个答案的基础上再接再厉:我遇到了麻烦。也许你能提供一些见解?
    #include <array>
    #include <iostream>
    #include <iterator>
    
    template <typename T>
    const auto& at(const T& v, size_t i) { return v[i]; }
    
    // End of recursion
    template<class T>
    void vector_insert_impl(std::ostream_iterator<int> &, const char*, const T&)
    {}
    
    // Recursion case
    template<class T, std::size_t N, std::size_t... I>
    void vector_insert_impl(std::ostream_iterator<int> & iter, const char* delim, const T&rhs)
    {
        *iter++ = at(rhs, N);
    
        // Continue the recursion
        vector_insert_impl<T, I...>(iter, delim, rhs);
    }
    
    template <typename T, std::size_t... I>
    std::ostream& vector_insert(std::ostream& lhs, const char* delim, const T& rhs, std::index_sequence<I...>) 
    {
        std::ostream_iterator<int> it(lhs, delim);
    
        // Call the recursive implementation instead
        vector_insert_impl<T, I...>(it, delim, rhs);
    
        return lhs;
    }
    
    int main() {
        std::array<int, 5> v = { 1, 2, 3, 4, 5 };
        vector_insert(std::cout, " ", v, std::make_index_sequence<v.size()>());
    }