考虑以下代码:
#include <iostream>
#include <vector>
#include <algorithm>
template <typename T, template <typename> typename U>
T get_max(U<T>& gr) {
return *std::max_element(gr.begin(), gr.end());
}
int main() {
std::vector<int> c = {1, 2, 3};
get_max(c);
}
在上述代码的GCC accepts中,Clang和MSVC reject表示参数(std::vector
)具有不同的类型(std::vector
有两个template
参数,但我只介绍了一个):
<source>:14:5: error: no matching function for call to 'get_max' get_max(c); ^~~~~~~ <source>:7:3: note: candidate template ignored: substitution failure [with T = int]: template template argument has different template parameters than its corresponding template template parameter T get_max(U<T>& gr) { ^ 1 error generated. Compiler returned: 1
哪个编译器是正确的?
据我所知,GCC是正确的,因为第二个template
类型是可推论的(由于默认类型),但是由于实际的签名不匹配,这可能不是合法代码。