尝试从可变函数模板调用基本情况重载的编译器错误
Compiler error trying to call base-case overloads from variadic function template
我正在尝试编写一个调用单参数重载作为基本情况的可变参数模板函数。基本情况不能在我的可变参数之前声明,因为它们涉及在其他地方定义的类型。我需要这个来与 gcc-4.7.2 一起工作。我有以下 MWE。
template<class T, class U, class... Args>
void print(T const& t, U const& u, Args const&... args)
{
print(t);
print(u, args...);
}
void print(int){}
void print(float){}
int main(int, char*[])
{
int i;
float f;
print(i, f);
}
我的原版与 VC 一起工作,但此 MWE 在 gcc-4.7.2 中失败并显示以下内容。
main.cpp: In instantiation of ‘void print(const T&, const U&, const Args& ...) [with T = int; U = float; Args = {}]’:
main.cpp:15:12: required from here
main.cpp:4:2: error: no matching function for call to ‘print(const int&)’
main.cpp:4:2: note: candidate is:
main.cpp:2:6: note: template<class T, class U, class ... Args> void print(const T&, const U&, const Args& ...)
main.cpp:2:6: note: template argument deduction/substitution failed:
main.cpp:4:2: note: candidate expects 3 arguments, 1 provided
main.cpp:5:2: error: no matching function for call to ‘print(const float&)’
main.cpp:5:2: note: candidate is:
main.cpp:2:6: note: template<class T, class U, class ... Args> void print(const T&, const U&, const Args& ...)
main.cpp:2:6: note: template argument deduction/substitution failed:
main.cpp:5:2: note: candidate expects 3 arguments, 1 provided
不应该启动第二阶段查找并找到下面声明的重载吗?
void print(int);
,void print(float);
应该先声明。
print(MyClass)
感谢ADL后可以申报
我正在尝试编写一个调用单参数重载作为基本情况的可变参数模板函数。基本情况不能在我的可变参数之前声明,因为它们涉及在其他地方定义的类型。我需要这个来与 gcc-4.7.2 一起工作。我有以下 MWE。
template<class T, class U, class... Args>
void print(T const& t, U const& u, Args const&... args)
{
print(t);
print(u, args...);
}
void print(int){}
void print(float){}
int main(int, char*[])
{
int i;
float f;
print(i, f);
}
我的原版与 VC 一起工作,但此 MWE 在 gcc-4.7.2 中失败并显示以下内容。
main.cpp: In instantiation of ‘void print(const T&, const U&, const Args& ...) [with T = int; U = float; Args = {}]’:
main.cpp:15:12: required from here
main.cpp:4:2: error: no matching function for call to ‘print(const int&)’
main.cpp:4:2: note: candidate is:
main.cpp:2:6: note: template<class T, class U, class ... Args> void print(const T&, const U&, const Args& ...)
main.cpp:2:6: note: template argument deduction/substitution failed:
main.cpp:4:2: note: candidate expects 3 arguments, 1 provided
main.cpp:5:2: error: no matching function for call to ‘print(const float&)’
main.cpp:5:2: note: candidate is:
main.cpp:2:6: note: template<class T, class U, class ... Args> void print(const T&, const U&, const Args& ...)
main.cpp:2:6: note: template argument deduction/substitution failed:
main.cpp:5:2: note: candidate expects 3 arguments, 1 provided
不应该启动第二阶段查找并找到下面声明的重载吗?
void print(int);
,void print(float);
应该先声明。
print(MyClass)
感谢ADL后可以申报