未找到匹配的 C++ 模板运算符
C++ template operator not found as match
我正在尝试为 std::ostream
和任何 Iterable 类型创建一个通用的 operator<<
。
这是代码:
template <class T,template<class> class Iterable> inline std::ostream& operator<<(std::ostream& s,const Iterable<T>& iter){
s << "[ ";
bool first=false;
for(T& e : iter){
if(first){
first=false;
s << e;
}else{
s << ", " << e;
}
}
s << " ]";
return s;
}
不幸的是,找不到我的运算符作为 vector<uint>
的匹配项,编译器尝试与 operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
匹配。
知道如何更改要识别的过载吗?
你的问题的直接解决方案是 vector
是 两种 类型的模板,而不是一种,所以你想写:
template <typename... T, template <typename... > class Iterable>
inline std::ostream& operator<<(std::ostream& os, const Iterable<T...>& iter)
{
s << "[ ";
bool first = true; // not false
for (const auto& e : iter) {
// rest as before
}
return s << " ]";
}
这行得通,但有点不令人满意 - 因为有些模板是不可迭代的,而有些不是模板的是。此外,我们的解决方案实际上不需要 Iterable
或 T
。那么我们写一些接受任何 Range 的东西怎么样 - 我们将 Range 定义为具有 begin()
和 end()
:
的东西
template <typename Range>
auto operator<<(std::ostream& s, const Range& range)
-> decltype(void(range.begin()), void(range.end()), s)
{
// as above, except our container is now named 'range'
}
如果太一般,那么你可以这样做:
template <typename T> struct is_range : std::false_type;
template <typename T, typename A>
struct is_range<std::vector<T,A>> : std::true_type;
// etc.
template <typename Range>
typename std::enable_if<
is_range<Range>::value,
std::ostream&
>::type
operator<<(std::ostream& s, const Range& range)
我正在尝试为 std::ostream
和任何 Iterable 类型创建一个通用的 operator<<
。
这是代码:
template <class T,template<class> class Iterable> inline std::ostream& operator<<(std::ostream& s,const Iterable<T>& iter){
s << "[ ";
bool first=false;
for(T& e : iter){
if(first){
first=false;
s << e;
}else{
s << ", " << e;
}
}
s << " ]";
return s;
}
不幸的是,找不到我的运算符作为 vector<uint>
的匹配项,编译器尝试与 operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
匹配。
知道如何更改要识别的过载吗?
你的问题的直接解决方案是 vector
是 两种 类型的模板,而不是一种,所以你想写:
template <typename... T, template <typename... > class Iterable>
inline std::ostream& operator<<(std::ostream& os, const Iterable<T...>& iter)
{
s << "[ ";
bool first = true; // not false
for (const auto& e : iter) {
// rest as before
}
return s << " ]";
}
这行得通,但有点不令人满意 - 因为有些模板是不可迭代的,而有些不是模板的是。此外,我们的解决方案实际上不需要 Iterable
或 T
。那么我们写一些接受任何 Range 的东西怎么样 - 我们将 Range 定义为具有 begin()
和 end()
:
template <typename Range>
auto operator<<(std::ostream& s, const Range& range)
-> decltype(void(range.begin()), void(range.end()), s)
{
// as above, except our container is now named 'range'
}
如果太一般,那么你可以这样做:
template <typename T> struct is_range : std::false_type;
template <typename T, typename A>
struct is_range<std::vector<T,A>> : std::true_type;
// etc.
template <typename Range>
typename std::enable_if<
is_range<Range>::value,
std::ostream&
>::type
operator<<(std::ostream& s, const Range& range)