C++ 在这种情况下,将什么语法放入decltype(x)中来指定返回类型

C++ 在这种情况下,将什么语法放入decltype(x)中来指定返回类型,c++,c++11,auto,decltype,C++,C++11,Auto,Decltype,我使用以下函数将迭代器的std::vector创建到另一个容器中: template <typename T, template <typename, typename = std::allocator<T>> class Con> std::vector<typename Con<T>::iterator> make_itervec(Con<T>& v) { std::vector<

我使用以下函数将迭代器的std::vector创建到另一个容器中:

template <typename T,
          template <typename, typename = std::allocator<T>> class Con>
std::vector<typename Con<T>::iterator> make_itervec(Con<T>& v)
{
    std::vector<typename Con<T>::iterator> itervec;
    for (auto i = v.begin(); i != v.end(); ++i)
    {
        itervec.push_back(i);
    }
    return itervec;
}

另外,我不是这方面的专家,所以欢迎提出任何其他建议和意见!谢谢。

我觉得你在这里做的工作太多了。您需要做的就是:

template <typename T,
          template <typename, typename = std::allocator<T>> class Con>
auto make_itervec(Con<T>& v) -> decltype(x) // This line
{
    std::vector<typename Con<T>::iterator> itervec;
    for (auto i = v.begin(); i != v.end(); ++i)
    {
        itervec.push_back(i);
    }
    return itervec;
}
template <typename T>
std::vector<typename T::iterator> make_itervec(T& v)
{
    std::vector<typename T::iterator> itervec;

    for (auto i = v.begin(); i != v.end(); ++i)
    {
        itervec.push_back(i);
    }

    return itervec;
}

我认为你在这里做的工作太多了。您需要做的就是:

template <typename T,
          template <typename, typename = std::allocator<T>> class Con>
auto make_itervec(Con<T>& v) -> decltype(x) // This line
{
    std::vector<typename Con<T>::iterator> itervec;
    for (auto i = v.begin(); i != v.end(); ++i)
    {
        itervec.push_back(i);
    }
    return itervec;
}
template <typename T>
std::vector<typename T::iterator> make_itervec(T& v)
{
    std::vector<typename T::iterator> itervec;

    for (auto i = v.begin(); i != v.end(); ++i)
    {
        itervec.push_back(i);
    }

    return itervec;
}

可以使用std::vector或std::vector。注意,std::vector周围没有decltype,因为它已经是一个类型,而不是一个变量或表达式。decltype仅用于获取表达式的类型。

可以使用std::vector或std::vector。注意,std::vector周围没有decltype,因为它已经是一个类型,而不是一个变量或表达式。decltype仅用于获取表达式的类型。

谢谢,您为我指明了正确的方向。但是,使用std::vector在编译错误时不起作用,但使用gcc 4.7.0时,std::vector起作用。@ildjarn:Nope,相同的错误:需要一个类型,得到了decltype v::iterator。@ildjarn:I使用的是std::vector itervec=make_itervecv;在我的代码中,它也很好用,所以我肯定不明白为什么它不起作用。你在decltypev之前错过了一个typename::@johanneschaub-litb:你说得对!我还需要传递函数参数的值。谢谢,您为我指明了正确的方向。但是,使用std::vector在编译错误时不起作用,但使用gcc 4.7.0时,std::vector起作用。@ildjarn:Nope,相同的错误:需要一个类型,得到了decltype v::iterator。@ildjarn:I使用的是std::vector itervec=make_itervecv;在我的代码中,它也很好用,所以我肯定不明白为什么它不起作用。你在decltypev之前错过了一个typename::@johanneschaub-litb:你说得对!我还需要传递函数参数的值。