LINUX.ORG.RU

g++ и локальные классы


0

0

Сейчас пытаюсь затолкать внутрь класса другой, шаблонный. Как только делаю полную специализацию заталкиваемого класса -- гцц говорит, что "ошибка: явная специализация в не-namespace области 'class Класс_в_который_заталкиваю_другой'".

Причём визуалка такой код съедает без вопросов. Что гцц-у не нравится, и как это исправить?

Снимите шапочку из фольги, а то наше подразделение телепатов не может зателепать ваши исходники.

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

Шапочку... Щас, айн момент.

//normalize.hpp
template <typename N>
class Normalize
{
private:
	N n;
public:
	Normalize()
		: n()
	{ return; }
	Normalize(N in)
		: n(in)
	{ return; }
	N operator () (const N& in)
	{ return in; }
};

//propertis.hpp
template <class Type,class Normalize>
class Propertis
{
protected:
	Type t;
	Normalize norm;
	Propertis(const Propertis&) { return; }
public:
	Propertis() : t() { return; }
	Propertis(Normalize inorm) : t(),norm(inorm) { return; }
	Propertis(Type it,Normalize inorm) : t(it),norm(inorm) { return; }
	friend std::ostream& operator << (std::ostream& os,Propertis& p1)
	{ os<<p1.t; return os; }
	friend std::istream& operator >> (std::istream& is,Propertis& p1)
	{ is>>p1.t; return is; }
	Type& operator = (const Type& it)
	{return (t=norm(it)); }
	operator Type(void)
	{ return t; }
};

//main.cpp
class Window
{
protected:
#include "./normalize.hpp"
#include "./propertis.hpp"
	int i;
public:
	Window(void)
		: width(Normalize<unsigned int>(1280)),			\
			height(Normalize<unsigned int>(1024)),		\
			name(Normalize<std::string>())
	{ return; }
	Propertis<unsigned int,Normalize<unsigned int> > width;
	Propertis<unsigned int,Normalize<unsigned int> > height;
	Propertis<std::string,Normalize<std::string> > name;
};
//--------------------------------------------------------------------
int main(int argc,char** argv)
{
	Window window;
	window.width=1280;
	window.height=1024;
	window.name="Test window";
	std::cout<<"window.width="<<window.width<<std::endl;
	std::cout<<"window.height="<<window.height<<std::endl;
	std::cout<<"window.name="<<"\'"<<window.name<<"\'"<<std::endl;
	return 0;
}

При попытке полностью специализировать класс Normalize и валится кучка ошибок.

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

Скопировал всё в 1 файл, удалил вот это:
#include "./normalize.hpp"
#include "./propertis.hpp"

- усё скомпилялось и запустилось. Выдало
d:/work $ ./lordemo
window.width=1280
window.height=1024
window.name='Test window'
[/code]

Для справки:
d:/work $ g++ --version
g++.exe (GCC) 3.4.2 (mingw-special)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

З.Ы. Не бейте за винду, на работе сижу

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

Как лечится? И почему у визуалки нет такой проблемы?

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

>А специализацию Normalize делал? Без специализации-то работает, ога.

Речь идёт о частичной специализации?

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

Ты бы запостил сюда что конкретно у тебя не собирается. Не хочется телепатить про то что за специализацию ты имеешь ввиду и как её делаешь.

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

У Александреску в книге все собирается на gcc. Видимо уперто криво.

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

Когда перетянул специализацию из класса в глобальное пространство имён, всё завелось.

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

> Опять-же, почему визуалка допускает подобное безобразие?

Потому что её спецификация языка живёт отдельной жизнью от общепринятого стандарта. Что уж говорить про C++, когда там даже с C99 грабли?

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

> С99 новее С++ 98 :)

То есть я поторопился с выбором C99 для своих программ?.. :)

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