考虑以下2个重载
template<typename T>
bool test() {
return true;
}
template<template<typename ...> class T>
bool test() {
return false;
}
第一个适用于常规类,而第二个适用于未实例化的模板。例如:
std::cout<<test<int>()<<std::endl; <-- this yields 1
std::cout<<test<std::list>()<<std::endl; <--this yields 0
现在考虑以下模板函数:
template<typename U>
bool templfun(){
struct A{
bool f(){
return test<A>(); // <-- this gives an error
}
};
return test<A>(); // <-- this is ok
}
在GCC中,当Clang编译时,它为模棱两可的重载解决方案给出了错误。有趣的是,第二次调用test()不会产生错误(即使在GCC中也是如此)。而且,如果我删除template<typename U>
templfun顶部的东西,gcc会停止抱怨。
这是GCC的错误还是非法代码?