Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.08.2010, 17:08   #1
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию вложенные шаблонные классы

не пойму, почему студия дает специализировать вложенные шаблонные классы, гцц нет. кто нить в состоянии внятно объяснить, почему этого делать нельзя?
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 07.08.2010, 11:35   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

А можно пример? У меня в таком случае работает:
Код:
#include <iostream>

template <class T, class N>
class First {
public:
	template <class M>
	class Second {
	public:
		M i;
	};

	template <>
	class Second<N> { // Параметр шаблона Second совпадает со вторым параметром шаблона First
	public:
		unsigned int i;
	};

	template <>
	class Second<T> { // Параметр шаблона Second совпадает с первым параметром шаблона First
	public:
		unsigned long long int i;
	};
};

int main() {
	First <int, char>::Second <short> object_a;
	First <int, char>::Second <char>  object_b; // первая специализация
	First <int, char>::Second <int>   object_c; // вторая специализация

	object_a.i = -1;
	object_b.i = -1;
	object_c.i = -1;

	std::cout << object_a.i << std::endl;
	std::cout << object_b.i << std::endl;
	std::cout << object_c.i << std::endl;

	std::cin.ignore ();
    return 0;
}
netrino вне форума Ответить с цитированием
Старый 07.08.2010, 13:27   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2netrino
твой пример подходит к описанию.

Цитата:
$ g++ main.cpp
main.cpp:30: error: explicit specialization in non-namespace scope ‘class First<T, N>’
main.cpp:31: error: template parameters not used in partial specialization:
main.cpp:31: error: ‘T’
main.cpp:36: error: explicit specialization in non-namespace scope ‘class First<T, N>’
main.cpp:37: error: template parameters not used in partial specialization:
main.cpp:37: error: ‘N’
даже в нешаблонном классе не дает специализировать шаблонный класс. я не догоняю ошибку про пространство имен
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 07.08.2010, 14:29   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2netrino
твой пример подходит к описанию.



даже в нешаблонном классе не дает специализировать шаблонный класс. я не догоняю ошибку про пространство имен
Пардон, неправильно понял вопрос сначала. Пропустил тот код через кланг, у него получше сообщения об ошибках и совместимость с гцц. Выдал он по сути то же самое:
Цитата:
D:\>clang++ -fsyntax-only main.cpp
main.cpp(13) : error: explicit specialization of 'Second' in class scope
class Second<N> {
^
main.cpp(19) : error: explicit specialization of 'Second' in class scope
class Second<T> {
^
2 errors generated.
Вытащил специализацию из класса и кланг пропустил, но гцц всё равно валится на специализации
Цитата:
D:\>g++ -fsyntax-only main.cpp
main.cpp:14:11: error: invalid explicit specialization before '>' token
main.cpp:14:11: error: enclosing class templates are not explicitly specialized
main.cpp:15:20: error: template parameters not used in partial specialization:
main.cpp:15:20: error: 'T'
main.cpp:21:11: error: invalid explicit specialization before '>' token
main.cpp:21:11: error: enclosing class templates are not explicitly specialized
main.cpp:22:20: error: template parameters not used in partial specialization:
main.cpp:22:20: error: 'N'
как тут исправить пока в голову не пришло)
Код:
#include <iostream>

template <class T, class N>
class First {
public:
	template <class M>
	class Second {
	public:
		M i;
	};
};

template <class T, class N>
template <>
class First<T, N>::Second<N> {
	public:
		unsigned int i;
};

template <class T, class N>
template <>
class First<T, N>::Second<T> {
	public:
		unsigned long long int i;
};

int main() {
	First <int, char>::Second <short> object_a;
	First <int, char>::Second <char>  object_b;
	First <int, char>::Second <int>   object_c;

	object_a.i = -1;
	object_b.i = -1;
	object_c.i = -1;

	std::cout << object_a.i << std::endl;
	std::cout << object_b.i << std::endl;
	std::cout << object_c.i << std::endl;

	std::cin.ignore (); 
	return 0;
}
гцц - мингв 4.5.0

у гцц кажется всегда были какие-то проблемы с пространствами имён, ещё с чем-то подобным сталкивался, но сейчас не припомню с чем конкретно..

Последний раз редактировалось netrino; 07.08.2010 в 14:31.
netrino вне форума Ответить с цитированием
Старый 07.08.2010, 14:42   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2netrino
да как исправить то понятно) 1. убрать специализацию. 2. вынести за пределы класса. но хотелось бы разобраться, почему вложенные шаблоны не хочет. имхо удобно держать там traits всякие, требующиеся только самому классу, поэтому зачем их выносить за пределы
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 07.08.2010, 21:08   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ну это уже радикальные меры)
Где-то прочёл, что если вложенный класс специализируется, то и внешний тоже должен быть специализирован. То есть либо так:
Код:
#include <iostream>
#include <typeinfo>

template <typename Type>
class Scope {
public:
	template <typename T>
	class Spec {
	public:
		T n;
	};
};

template <>
template <>
class Scope<int>::Spec <int> {
public:
	unsigned int n;
};

int main() {
	Scope<int>::Spec <char> a;
	Scope<int>::Spec <int > b;
	
	std::cout << std::boolalpha << ( typeid (a.n) == typeid (char    ) ) << std::endl;
	std::cout << std::boolalpha << ( typeid (b.n) == typeid (unsigned) ) << std::endl;

	std::cin.ignore (); 
	return 0;
}
либо убирать "шаблонность" внешнего класса

Последний раз редактировалось netrino; 07.08.2010 в 21:13. Причина: бред написал
netrino вне форума Ответить с цитированием
Старый 07.08.2010, 21:20   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2netrino
ага, точно) я пытался специализировать с внешним классом, но забыл про второй template <> спасиб
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему нельзя разбивать на отдельные файлы шаблонные функции и классы? lordius Visual C++ 22 08.07.2010 09:49
Вложенные циклы. Arctopus Помощь студентам 11 20.02.2010 00:02
Вложенные классы. Lunex.08 Общие вопросы C/C++ 6 17.02.2010 12:01
шаблонные строковые функции MrKarapuz Общие вопросы C/C++ 7 09.11.2009 15:07