Error returning std :: set <T> :: iterator in the template
I am wrapping a template around std :: set. Why am I getting an error to declare a Begin () function?
template <class T>
class CSafeSet
{
public:
CSafeSet();
~CSafeSet();
std::set<T>::iterator Begin();
private:
std::set<T> _Set;
};
error: type 'std :: set, std :: allocator <_CharT → is not inferred from the type' CSafeSet
+5
1 answer
Try typename :
template <class T>
class CSafeSet
{
public:
CSafeSet();
~CSafeSet();
typename std::set<T>::iterator Begin();
private:
std::set<T> _Set;
};
You need a type name there, because it depends on the T template. For more information, see the link above the code. Many of these things are simplified if you use typedef:
template <class T>
class CSafeSet
{
public:
typedef T value_type;
typedef std::set<value_type> container_type;
typedef typename container_type::iterator iterator_type;
typedef typename container_type::const_iterator const_iterator_type;
CSafeSet();
~CSafeSet();
iterator_type Begin();
private:
container_type _Set;
};
, , CSafeSet , set, :
template <class T, class Compare = std::less<T>, class Allocator = std::allocator<T> >
class CSafeSet
{
public:
typedef T value_type;
typedef Compare compare_type;
typedef Allocator allocator_type;
typedef std::set<value_type, compare_type, allocator_type> container_type;
typedef typename container_type::iterator iterator_type;
typedef typename container_type::const_iterator const_iterator_type;
// ...
}
, , , , . , Begin() , , Begin() ( , C , , :])
+17