Spróbuj typename:
template <class T>
class CSafeSet
{
public:
CSafeSet();
~CSafeSet();
typename std::set<T>::iterator Begin();
private:
std::set<T> _Set;
};
Trzeba TypeName ponieważ jest zależny od szablonu T. Więcej informacji w linku powyżej kodu. Dużo z tych rzeczy jest łatwiejsze, jeśli używasz typedef użytkownika:
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;
};
Na marginesie, jeśli chcesz być kompletne trzeba zezwolić CSafeSet zrobić to samo jako set could, co oznacza, że przy użyciu niestandardowego comparer a podzielnik:
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;
// ...
}
i ostatni bit radę, jeśli masz zamiar utworzyć otoki wokół klasy, spróbuj wykonać te same konwencje nazewnictwa jak gdzie klasa pochodzi. Oznacza to, że Twój numer Begin()
powinien być prawdopodobnie begin()
(osobiście uważam, że C przed nazwą klasy jest dziwny, ale to od ciebie zależy:])
Uwaga: przeczytaj o tym, jak używać podkreślników w identyfikatorach. http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier/228797#228797 –
Krótka wersja: "Nie uruchamiaj nazw identyfikatorów za pomocą podkreśleń " – jalf
Wersja długa: podkreślenia poprzedzone wielką literą są zarezerwowane dla kompilatora. Podwójne podkreślenia, a następnie cokolwiek są zarezerwowane również dla kompilatora. – GManNickG