C++ enum won';不能使用类似模板的代码
我试图通过STL模拟boost::iterator_范围和boost::counting_迭代器。代码似乎正常工作,但当我尝试向其传递枚举元素时,会出现以下错误: 错误2错误C2100:非法间接寻址C++ enum won';不能使用类似模板的代码,c++,templates,enums,C++,Templates,Enums,我试图通过STL模拟boost::iterator_范围和boost::counting_迭代器。代码似乎正常工作,但当我尝试向其传递枚举元素时,会出现以下错误: 错误2错误C2100:非法间接寻址 错误1错误C2675:一元“++”:“‘匿名命名空间’::块_边” 未定义此运算符或转换为用户可接受的类型 预定义运算符 如何修复这些错误 代码 #include <iostream> namespace { enum Block_Edges { FRO
错误1错误C2675:一元“++”:“‘匿名命名空间’::块_边” 未定义此运算符或转换为用户可接受的类型 预定义运算符 如何修复这些错误 代码
#include <iostream>
namespace
{
enum Block_Edges
{
FROM = 0,
TO = 4,
};
};
template<typename T, bool enable = std::is_integral<T>::value>
struct range_impl
{
struct iterator
{
const T operator * ()const noexcept
{
return value;
}
iterator& operator ++() noexcept
{
++value;
return *this;
}
friend const bool operator != (const iterator& lhs, const iterator& rhs) noexcept
{
return lhs.value != rhs.value;
}
T value;
};
std::size_t size() const
{
return last - first;
}
const iterator begin()const noexcept
{
return{ first };
}
const iterator end()const noexcept
{
return{ last };
}
T first;
T last;
};
template<typename T>
struct range_impl<T, false>
{
range_impl(T first, T last)
: first(first)
, last(last)
{}
std::size_t size() const
{
return std::distance(first, last);
}
const T begin()const noexcept
{
return{ first };
}
const T end()const noexcept
{
return{ last };
}
T first;
T last;
};
template<typename T>
range_impl<T> range(T first, T last) noexcept
{
return{ first, last };
}
int main()
{
//for (const auto& i : range(0, 4)) // PASS
//{
// std::cout << '\n' << i << ':';
// for (const auto& j : range(0, 4))
// {
// std::cout << j << ' ';
// }
//}
for (const auto& i : range(Block_Edges::FROM, Block_Edges::TO)) // FAILED
{
std::cout << '\n' << i << ':';
for (const auto& j : range(Block_Edges::FROM, Block_Edges::TO))
{
std::cout << j << ' ';
}
}
}
#包括
名称空间
{
枚举块_边
{
FROM=0,
TO=4,
};
};
模板
结构范围
{
结构迭代器
{
常量T运算符*()常量noexcept
{
返回值;
}
迭代器和运算符++()noexcept
{
++价值观;
归还*这个;
}
friend const bool运算符!=(const迭代器和lhs、const迭代器和rhs)noexcept
{
返回lhs.value!=rhs.value;
}
T值;
};
std::size\u t size()常量
{
返回最后优先;
}
常量迭代器begin()常量noexcept
{
返回{first};
}
常量迭代器end()常量noexcept
{
返回{last};
}
T第一;
不持久;
};
模板
结构范围
{
范围\u impl(T第一,T最后)
:第一(第一)
,最后(最后)
{}
std::size\u t size()常量
{
返回标准::距离(第一个、最后一个);
}
常量T begin()常量noexcept
{
返回{first};
}
const T end()const noexcept
{
返回{last};
}
T第一;
不持久;
};
模板
范围\u impl range(T first,T last)无例外
{
返回{first,last};
}
int main()
{
//for(const auto&i:range(0,4))//通过
//{
//std::cout您有两个错误:
缺少此功能:
Block_Edges& operator++(Block_Edges& e)
{
return e = static_cast<Block_Edges>(e + 1);
}
如果错误消息说你没有定义模板所需的运算符,那么也许你应该定义它?@Happy..好的,但我已经在范围内定义了它\u impl
@Happy..我解决了它。它只需要强制转换。但是为什么它需要强制转换。非常糟糕的错误消息不,你做错了,让我稍后发布一个答案。“非常糟糕的错误消息”-对我来说似乎很好-你认为什么更好…?非常感谢,但我转到了另一个问题(const auto&i:range(Block_Edges::FROM,Block_Edges::to-1))
不会编译。@凡人:Block_-Edges::TO-1
是int
而Block_-Edges::FROM
是enum
,因此t
不能为范围推断。您可以将范围
更改为模板范围(T1优先,T2最后)不例外或调用范围(Block_-Edges::FROM,Block_-Edges::TO-1)
(或将Block_-Edges::TO-1
转换到枚举)太好了…我将实现这些。我通过为(const auto&i:range(Block_-Edges::FROM+0,Block_-Edges::TO-1))实现它,但我不喜欢它。
template<typename T,
bool enable = std::is_integral<T>::value || std::is_enum<T>::value>
struct range_impl