[英]Explicit specialization - template-id does not match any template declaration
[英]template-id does not match any template declaration
我不确定为什么TCollection
的size
函数模板的专业化失败。
template <typename C>
using detect_size = decltype(std::declval<C>().size());
template <typename C>
constexpr auto size(const C& c) -> decltype(c.size()) { return c.size(); }
template <typename C>
inline std::enable_if_t<
!is_detected<detect_size,C>::value, size_t >
size(const C& c) { return std::distance( std::begin(c), std::end(c) ); }
template <class T, size_t N>
constexpr size_t size(const T (&array)[N]) noexcept { return N; }
template <>
auto size<TCollection>(const TCollection& c) { return c.GetSize(); }
GCC 给了我
error: template-id 'size<TCollection>' for 'auto size(const TCollection&)'
does not match any template declaration
is_detected
在这里实现。
编辑:
std::distance
的实现会被选中。重载代码:
auto size(const TCollection& c) { return c.GetSize(); }
您必须为您的专业化使用与通用模板完全相同的声明,因此:
template <>
std::enable_if_t<!is_detected<detect_size, TCollection>::value, size_t >
size<TCollection>(const TCollection& c) { return c.GetSize(); }
更简单的是使用重载:
auto size(const TCollection& c) { return c.GetSize(); }
Jarod42 的回答仅部分适用于我的情况。
有两件事我没有意识到:
返回类型的确切拼写方式并不重要。 所以,而不是 Jarod42 建议的定义
template <>
std::enable_if_t<!is_detected<detect_size, TCollection>::value, size_t >
size<TCollection>(const TCollection& c) { return c.GetSize(); }
写就够了
template <>
size_t size(const TCollection& c) { return c.GetSize(); }
如果代码结构如下:
template <typename T>
size_t size(const T& x) { return x.size(); }
template <typename T>
std::vector<int> reserve_same_number_of_ints(const T& x) {
std::vector<int> vec;
vec.reserve(size(x));
return vec;
}
/* specialize or overload here for special_type */
/* call reserve_same_number_of_ints on the special_type */
选择了模板特化,但没有选择重载。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.