问题
I have a DD class
template<typename T>
class DD
: public IEnumerable<T>
{
typedef IEnumerable<T> Super;
typedef std::set<T*> Container;
And a method
template<typename T>
bool DD<T>::Enumerator::Move()
{
if(!mIt.get())
mIt.reset(
new Container::iterator( <-----
mContainer.GetContainer().begin()
)
);
...
}
When I compile the class, I got error: expected type-specifier
.
What's wrong with the Container::iterator()
?
回答1:
Try:
new typename Container::iterator
When you are in a C++ template, the compiler doesn't know whether Container::iterator is a type or something else. So you need to explicitly say that its a type.
On another note, creating an iterator with new is almost certainly wrong.
回答2:
new typename Container::iterator(
// ^^^^^^^^
Without the typename
, C++ will assume X::Y
is a member (value/function) when X is in a template. You need the typename
to force the compiler to interpret X::Y
as a type.
回答3:
Make that
new typename Container::iterator(
For a thorough explanation, see this FAQ.
来源:https://stackoverflow.com/questions/5250526/expected-type-specifier-error-in-g