Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
C++ std::初始值设定项\u列表作为模板类中的构造函数参数_C++_Templates_Stdinitializerlist - Fatal编程技术网

C++ std::初始值设定项\u列表作为模板类中的构造函数参数

C++ std::初始值设定项\u列表作为模板类中的构造函数参数,c++,templates,stdinitializerlist,C++,Templates,Stdinitializerlist,我试图在构造函数中使用std::initializer\u list来接受可变数量的参数。对于非模板类,它可以正常工作,但对于模板类,它会导致编译错误。谁能给我指出正确的方向?我的g++能够使用C++17 #include <iostream> #include <vector> #include <type_traits> #include <initializer_list> struct Nontemplate { // std::

我试图在构造函数中使用std::initializer\u list来接受可变数量的参数。对于非模板类,它可以正常工作,但对于模板类,它会导致编译错误。谁能给我指出正确的方向?我的g++能够使用C++17

#include <iostream>
#include <vector>
#include <type_traits>
#include <initializer_list>

struct Nontemplate
{
    // std::initializer_list for a function taking variable number of arguments
    template <class Iterator>
    Nontemplate(std::initializer_list<Iterator> list) {
        std::cout << "size: " << list.size() << std::endl;
        for(auto it : list) {
            std::cout << *it << std::endl;
        }
    }
};

template <class T, class TIterator>
struct Template
{
    std::vector<T> vec;

    Template(std::initializer_list<TIterator> list)
    {
        if(!std::is_same<typename std::iterator_traits<TIterator>::value_type, T>::value)
            throw std::runtime_error("Iterator value type is not the expected.");

        std::cout << "size: " << list.size() << std::endl;

        vec.clear();
        vec.reserve(list.size());
        for(T val : list)
            vec.push_back(val);
    }
};

int main()
{
    double vec[] = {0,1,2,3,4,5};

    Nontemplate cls0({vec, vec+2, vec+3, vec+4}); // no problem
    //Template cls1({vec, vec+2, vec+3, vec+4});  // compiling error
    return 0;
}
#包括
#包括
#包括
#包括
结构非模板
{
//采用可变参数数的函数的初始值设定项列表
模板
非模板(std::初始值设定项\u列表){
std::cout
模板cls1({vec,vec+2,vec+3,vec+4})
无法推断T

你可以用

模板cls1({vec,vec+2,vec+3,vec+4});

或提供自定义扣除指南:

template <typename It>
Template(std::initializer_list<It>)
-> Template<typename std::iterator_traits<It>::value_type, It>;

您得到的编译错误是什么?@1201programalam:错误消息是:main.cpp:42:45:错误:类模板参数推断失败:42 |模板cls1({vec,vec+2,vec+3,vec+4});//编译错误您需要在模板cls1中传递模板参数网。
list
的元素类型为
TIterator
,而不是
T
TIterator
可能与
T*
@jianz
Template
相同,也可能不同,但这里没有模板参数推断。您可以只要有一个模板参数:
TIterator
并将你的向量建立在它的基础上:
std::vector vec;
那么你就不必自己为模板提供类型了。此外,它还变成了编译时检查。这太棒了。在你发表文章之前,我一直在使用“模板”方法。我正在寻找的是你在这里提供的另外两种选择。非常感谢。你能纠正打字错误吗?我已经接受了这个解决方案。1)自定义推断指导方法:“->模板”;2)删除T方法:“使用T=typename std::iterator\u traits::value\u type;”@jianz:typos fixed。(如果仍有一些,请随意编辑)。
template <class TIterator>
struct Template
{
    using T = typename std::iterator_traits<TIterator>::value_type;
    std::vector<T> vec;

    Template(std::initializer_list<TIterator> list)
    {
        std::cout << "size: " << list.size() << std::endl;

        vec.clear();
        vec.reserve(list.size());
        for(T val : list)
            vec.push_back(val);
    }
};