我问这个question并得到了一个很好的答案,但还有一个关于 g++ 中带有 c++17 标志的模板参数推导的不清楚点。
如果我们采用这段代码:
#include <iostream>
#include <vector>
template<class T, class A>
void func(const std::vector<T, A>&v)
{
std::cout << 1 << std::endl;
}
template<typename T, typename A, template <typename, typename>class Vector>
void func(const Vector<T, A>&v)
{
std::cout << 2 << std::endl;
}
void f()
{
std::vector<int> v;
func(v);
}
int main()
{
f();
return 0;
}
第二个模板函数声明的不同。 在这种情况下相应地 answer模板参数推导应该和以前一样。但是编译器不会报告任何歧义。
产生歧义错误的第二个函数的先前版本:
template<typename T, template <typename>class Vector>
void func(const Vector<T>&v)
{
std::cout << 2 << std::endl;
}
在这种情况下我缺少什么?
最佳答案
有了这组新的重载函数:
template<class T, class A>
void func(const std::vector<T, A>&v)
template<typename T, typename A, template <typename, typename>class Vector>
void func(const Vector<T, A>&v);
第一个重载比第二个更专业:模板参数 T,A,Vector
如果我们传递类型为 std::vector<P1,P2>
的参数,则可以推导出第二个重载。其中 P1 和 P2 是两个发明的类型。
在使用上一组重载时:
template<class T, class A>
void func(const std::vector<T, A>&v);
template<typename T, template <typename>class Vector>
void func(const Vector<T>&v);
两个重载中没有一个比另一个更专业。因为前面描述的模板参数推导是不可实现的。
模板函数排名说明here .
关于c++ - g++ 8.1 模板推导歧义,std 标志等于 c++17 第 2 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51894724/