在C++中初始化模板函数内的auto(未知)类型的向量

axc*_*tor 16 c++ templates iterator stl

我有一个模板函数,我想在其中生成一个未知类型的向量.我试图让它自动,但编译器说它是不允许的.

模板函数获取迭代器或指针,如后面的main函数中的测试程序中所示.如何解决问题?

template<class Iter>
auto my_func(Iter beg, Iter end)
{
    if (beg == end)
        throw domain_error("empty vector");

    auto size = distance(beg, end);

    vector<auto> temp(size); // <--HERE COMPILER SAYS CANNOT BE AUTO TYPE
    copy(beg, end, temp->begin);
    .
    .
    return ....

}


int main()
{
    int bips[] = {3, 7, 0, 60, 17}; // Passing pointers of array
    auto g = my_func(bips, bips + sizeof(bips) / sizeof(*bips));

    vector<int> v = {10, 5, 4, 14}; // Passing iterators of a vector
    auto h = my_func(v.begin(), v.end());

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Edg*_*jān 43

你不能使用std::vectorauto.您可以使用std :: iterator_traits:

std::vector<typename std::iterator_traits<Iter>::value_type> temp(size);
Run Code Online (Sandbox Code Playgroud)


Vas*_*kin 32

如果你有一个兼容C++ 17的编译器,你可以从类模板参数推导中获益.

因此,除非您有特定的理由填充矢量std::copy,否则您可以编写如下代码:

template<class Iter>
auto my_func(Iter beg, Iter end)
{
    if (beg == end)
        throw domain_error("empty vector");

    vector temp(beg, end);
    // do the remaining stuff
    return ....
}
Run Code Online (Sandbox Code Playgroud)

如果您的编译器没有此功能,那么我会投票支持

vector<typename iterator_traits<Iter>::value_type> temp(beg, end);
Run Code Online (Sandbox Code Playgroud)

就像乔纳森的回答一样

  • 你忘记了`typename`,因为`value_type`是一个依赖类型. (2认同)

Igo*_*nik 7

你可能正在寻找类似的东西

std::vector<typename std::remove_reference<decltype(*beg)>::type> temp(beg, end);
Run Code Online (Sandbox Code Playgroud)

演示

  • 如果`*iterator`返回一个代理,那将无法工作,就像三次调用`std :: vector <bool>`-specialization一样. (2认同)