LINUX.ORG.RU

Шаблон в шаблоне


0

1

Помогите понять как правильно записать следующее:

template <typename T>
class A
{
public:
	template <typename U>
	class B
	{
	public:
		static int foo;
	};
};

template <typename T, typename U>
void bar()
{
	A<T>::B<U>::foo = 5;
}

int main()
{
	bar<int, char>();
	return 0;
}

Ругается на строке:

A<T>::B<U>::foo = 5;
main.cpp: In function ‘void bar()’:
main.cpp:17:11: error: expected primary-expression before ‘>’ token
main.cpp:17:12: error: ‘::foo’ has not been declared
main.cpp: In function ‘void bar() [with T = int, U = char]’:
main.cpp:22:17:   instantiated from here
main.cpp:17:2: error: dependent-name ‘A<T>::B’ is parsed as a non-type, but instantiation yields a type
main.cpp:17:2: note: say ‘typename A<T>::B’ if a type is meant
★★★★★

$ clang++ 1.cpp
1.cpp:16:9: error: use 'template' keyword to treat 'B' as a dependent template name
  A<T>::B<U>::foo = 5;
        ^
        template 
1 error generated.
anonymous ()
Ответ на: комментарий от anonymous
main.cpp:17:2: error: dependent-name ‘A<T>::B’ is parsed as a non-type, but instantiation yields a type

Мне кажется этого более чем достаточно :)

Jetty ★★★★★ ()
Ответ на: комментарий от namezys

во извращенец

правильно делает, clang для дебажной сборки - самое логичное решение, из плюсов:

а) вменяемые сообщения об ошибках;
б) скорость компиляции;
в) дополнительные варнинги.

vaino ()
Ответ на: комментарий от Jetty

Мне кажется этого более чем достаточно :)

Для тех, кто досконально знает синтаксис шаблонов или уже хотя бы раз наталкивался на подобное — да.

Dendy ★★★★★ ()
Ответ на: комментарий от vaino

В CMake понадобилось всего-лишь сменить CMAKE_CXX_COMPILER на /usr/bin/clang++. Для отладки самое то. Единственное, пришлось пока отключить precompiled headers, на досуге посмотрю, как они делаются в clang.

Dendy ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.