错误:"e"不是类、命名空间或枚举
error: 'e' is not a class, namespace, or enumeration
我试图重载操作符<<用于仅打印STL容器的每两个元素。但是我在编译过程中有一个错误:
error: 'e' is not a class, namespace, or enumeration
下面是我的代码:
#include <iostream>
#include <vector>
template<typename T>
std::ostream& operator<<(std::ostream &out, T const &e){
for(e::iterator it = e.begin(); it != e.end(); it = it + 2){
out << *it << " ";
}
return out;
}
int main(){
std::vector<int> v;
for(int i= 0; i < 10; i++){
v.push_back(i);
}
std::cout << v;
return 0;
}
这里有两个问题。
1是与e::iterator
。您不能通过对象访问成员类型,您需要使用该类型。相反,你应该使用auto it = e.begin()
。如果你不能使用c++ 11,那么你需要使用
typename T::const_iterator it = e.begin()
需要typename
,因为名称依赖于模板参数,需要const_iterator
而不仅仅是iterator
,因为参数标记为const
。
然而,你更严重的错误是在一开始就造成了这种重载。
template<typename T>
std::ostream& operator<<(std::ostream &out, T const &e){
声明了对任意类型的std::ostream
输出的重载。这肯定会让您感到头痛,而且,如果您修复了第一个错误,那么在尝试输出" "
:
main.cpp:7:20: error: use of overloaded operator '<<' is ambiguous (with operand types '__ostream_type' (aka 'basic_ostream<char, std::char_traits<char> >') and 'const char [2]')
out << *it << " ";
~~~~~~~~~~ ^ ~~~
如果你真的想让这个工作与每个标准库容器,我猜你检查是否存在像T::iterator
这样的东西,只有当它是真的,你才启用你的重载。像这样:
template<typename T, typename = typename T::iterator>
std::ostream& operator<<(std::ostream &out, T const &e){
for(auto it = e.begin(); it != e.end(); it = it + 2){
out << *it << " ";
}
return out;
}
现场演示
相关文章:
- 如何公开库的枚举,以便我的代码不必键入整个命名空间来使用该枚举?
- 如何理解c++中在命名空间内部定义的枚举类型enum
- C++-使用来自不同头文件、相同命名空间的枚举
- 访问向量字段的键 - 枚举类还是命名空间中的枚举?
- 枚举类不是类或命名空间
- 在命名空间中使用枚举
- 枚举、类、命名空间和长名称
- C++11 枚举类命名空间块
- 类名和枚举值之间的冲突:无需命名空间即可解析
- 命名空间中的doxygen枚举
- 在不膨胀命名空间的情况下在C++中声明枚举的好方法
- 将C++命名空间枚举包装到C接口
- 在类中映射命名空间枚举
- 空的、未命名的枚举说明符的合法性
- 不是创建模板类后的类、命名空间或枚举
- 不同文件中同一命名空间中的 2 个不同枚举中的相同标识符
- 或命名空间中的枚举
- is_error_code_enum<>枚举必须仅在全局命名空间中定义?
- C++ 定义不同命名空间的枚举
- ' static constexpr auto '数据成员初始化为未命名的枚举