C++11 C+中的模板化参数推导+;

C++11 C+中的模板化参数推导+;,c++11,C++11,是否有任何方法可以构造此代码,以便我不必指定bar的模板参数 i、 e.它当前未编译,但如果我在main中将bar(v)更改为bar(v),它将编译 #include <cstdlib> #include <vector> template <class T> struct foo { foo(std::vector<T>& v) { } }; template <class T> void bar(

是否有任何方法可以构造此代码,以便我不必指定
bar
的模板参数

i、 e.它当前未编译,但如果我在
main
中将
bar(v)
更改为
bar(v)
,它将编译

#include <cstdlib>
#include <vector>

template <class T>
struct foo
{
    foo(std::vector<T>& v)
    {
    }
};

template <class T>
void bar(const foo<T>& f)
{
}

int main()
{
    std::vector<int> v;

    bar(v); // does not compile
    bar<int>(v); // compiles but is undesirable

    return EXIT_SUCCESS;
}
#包括
#包括
模板
结构foo
{
foo(std::vector&v)
{
}
};
模板
空栏(恒富和恒富)
{
}
int main()
{
std::向量v;
bar(v);//不编译
bar(v);//编译,但不需要
返回退出成功;
}

编译器只允许进行一次隐式转换,但您可以为
bar
添加重载,该重载尝试将您提供的任何内容转换为
foo
,然后使用临时
foo
调用原始
bar
(如果原始代码中允许进行两次隐式转换,则会发生这种情况):

模板
空心钢筋(T&v){
返回杆(foo(v));
}
由于
foo
中的转换构造函数不接受
const&
的参数,因此该
条也不能重载

template<typename T>
void bar(T& v) {
    return bar(foo(v));
}