typename pole statyczne/ typ zagnieżdżony.

0
std::thread::id id;

Dlaczego można tak zrobić? Jak pamiętam w C++ ( przynajmniej w C++ < C++11) w takiej sytuacji należało zrobić tak:

typename std::thread::id id;

w celu uniknięcia dwuznaczności: może to być albo podklasa ( typ) albo pole statyczne ( wartość).

Jednak teraz takie coś się kompiluje. Ja coś mieszam czy C++11 coś zmienia?

3

std::thread to zwykła klasa, a nie szablon.

0

A dlaczego problem jest w przypadku szablonów, a w przypadku zwykłych klas nie ma?

1

Prawdopodobnie nie rozumiesz nawet o co chodzi.

Przykład:

class foo
{
	class iterator
	{
	};
};

template <typename T>
void func()
{
	T::iterator a; // BŁĄD KOMPILACJI
}

int main() 
{
	func<foo>();
}

Wystąpi błąd kompilacji, bo kompilator nie wie co to jest T::iterator. Więc trzeba dać mu informacje odnośnie tego czym jest T::iterator, a jest to typ, czyli typename.

Zresztą sam kompilator daje jasną informacje, dlaczego typename jest wymagane:

prog.cpp: In function 'void func()':
prog.cpp2: error: need 'typename' before 'T:: iterator' because 'T' is a dependent scope
T::iterator a;
^
prog.cpp14: error: expected ';' before 'a'
T::iterator a;
^
prog.cpp: In instantiation of 'void func() [with T = foo]':
prog.cpp12: required from here
prog.cpp2: error: dependent-name 'T:: iterator' is parsed as a non-type, but instantiation yields a type
T::iterator a;
^
prog.cpp2: note: say 'typename T:: iterator' if a type is meant

Więc, poprawny kod to:

class foo
{
	class iterator
	{
	};
};

template <typename T>
void func()
{
	typename T::iterator a; // OK
}

int main() 
{
	func<foo>();
}

Więcej możesz poczytać tutaj: http://en.cppreference.com/w/cpp/language/dependent_name

0

Jeżeli to jest klasa, to niby jaka dwuznaczność może być? Kompilator zna deklarację klasy, wie dokładnie czy coś jest typem czy polem statycznym.
Natomiast podczas parsowania kodu szablonu

template <typename T>
...

kompilator nie wie czym jest argument szablonu T (teoretycznie może to być dowolny typ), więc nie wie czy odwołując się do T::x masz na myśli zmienną statyczną x czy typ x.

1 użytkowników online, w tym zalogowanych: 0, gości: 1