【发布时间】:2014-03-11 13:02:57
【问题描述】:
我正在尝试根据我的需要调整Avoiding struct in variadic template function 中提出的解决方案。但是,我无法理解 G++ 的行为。考虑以下函数:
template <typename T, unsigned Size>
int nextline(const typename std::array<T, Size> ar) {
return 0;
}
然后调用
nextline(std::array<int, 2> { 1,0 });
与抱怨的 GCC 不匹配
eslong.cpp: In function ‘int main()’:
eslong.cpp:10:38: error: no matching function for call to ‘nextline(std::array<int, 2ul>)’
nextline(std::array<int, 2> { 1,0 });
^
eslong.cpp:10:38: note: candidate is:
eslong.cpp:4:5: note: template<class T, unsigned int Size> int nextline(std::array<T, Size>)
int nextline(const typename std::array<T, Size> ar) {
^
eslong.cpp:4:5: note: template argument deduction/substitution failed:
eslong.cpp:10:38: note: mismatched types ‘unsigned int’ and ‘#‘integer_cst’ not supported by dump_type#<type error>’
nextline(std::array<int, 2> { 1,0 });
^
eslong.cpp:10:38: note: ‘std::array<int, 2ul>’ is not derived from ‘std::array<T, Size>’
但是,如果我将 unsigned Size 更改为 unsigned long Size 或 size_t,它会匹配。我不确定这里发生了什么。对std::array<T, Size>的调用中的Size参数不是转换成size_t了吗?
【问题讨论】:
-
它对我来说编译得很好:ideone.com/1FEmgZ
-
1)
typename在这里是错误的 (const typename std::array....)。 2)需要完全匹配非类型模板参数的类型,见[temp.deduct.type]/17。
标签: c++ arrays c++11 integer template-argument-deduction