Попробуйте typename :
template <class T>
class CSafeSet
{
public:
CSafeSet();
~CSafeSet();
typename std::set<T>::iterator Begin();
private:
std::set<T> _Set;
};
Вам нужно typename, потому что оно зависит от шаблона T. Более подробную информацию можно найти по ссылке над кодом. Многое из этого становится проще, если вы используете 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 делать то же самое, что набор мог бы , что означает использование собственного компаратора и распределителя:
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 перед именем класса странно, но это ваше дело:])