LINUX.ORG.RU

шаблонный класс && static экземпляр в нем же


0

0

вообщем понятно, что я где-то не прав, только
где. subj у меня выглядит примерно так:

---- .hpp файл ----
template <bool AUTO> class AutoTime {
...
void update();
...
inline uint getHour(){
if(AUTO) update();
return mHour;
};
inline uint getMinute(){
if(AUTO) update();
return mMinute;
};
...
// special instance
static AutoTime<true> current;
};

typedef AutoTime<false> Time;
---------------------

---- .cpp файл ----
AutoTime<true> cTime::current;
---------------------

$ g++ -Wall -c AutoTime.cpp -o AutoTime.o
AutoTime.cpp:20: error: too few template-parameter-lists
(это он про эту самую строчку из cpp)

Даже не знаю что с этим можно сделать :-(. Heeeeelp.

Цель данных извращений - получть возможность
писать примерно такое:

logStream << Time::current.toString(TIME_FORMAT_RFC822)
<< " : event!!!\n";

anonymous

Многое поскипал...

template <bool AUTO> class AutoTime {
public:
	static AutoTime<true> current;
};

AutoTime<true> AutoTime<false>::current;

Так же есть пару замечаний:

1 т.к. getMinute/getHour видимого состояния не меняют, то должны быть
  объявлены как const:
  
  int getHour() const;

2 Указание спецификатора inline для getMinute/getHour лишнее, они и так являются встраиваемыми, т.к. их определение находится внутри класса

3  }; точка с запятой полсе определения функции лишняя

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

> Многое поскипал...
>
> template <bool AUTO> class AutoTime {
>     public:
>         static AutoTime<true> current;
> };

Виноват, надо было вывести целый файл. Это было
просто примерно. current и был в publice.

> 1 т.к. getMinute/getHour видимого состояния не меняют, то должны быть
>   объявлены как const:

Согласен. Но update() меняет состояние. Сделал
изменяемые данные mutable. Все get* методы - const,
все set* методы ! const

> 2 Указание спецификатора inline для getMinute/getHour лишнее,
> они и так являются встраиваемыми, т.к. их определение находится
> внутри класса

Просто когда указываешь inline - сразу видно что метод inline.
А так - есть некоторая неопределенность (IMO).

> 3  }; точка с запятой полсе определения функции лишняя

Не знаю откуда у меня эта привычка :-)

Спасибо за замечания
Вот полные файлы:

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

$ cat AutoTime.hpp
#ifndef __AUTO_TIME_HPP_INCLUDED__
#define __AUTO_TIME_HPP_INCLUDED__

#include <sys/types.h>

#include <ctime>
#include <string>

typedef std::string String;

#define TIME_FMT_ANSI		"%a %b %e %H:%M:%S %Y"
#define TIME_FMT_DEFAULT	"%d.%m.%Y %H:%M:%S"
#define TIME_FMT_RFC822		"%a, %d %b %Y %H:%M:%S %z"
#define TIME_FMT_RFC850		"%A, %d-%b-%Y, %H:%M:%S %Z"

template <bool AUTO> class AutoTime {
	public:
		enum eMonth {
			JAN = 1,  FEB, MAR, APR, MAY, JUN,
			JUL, AUG, SEP, OCT, NOV, DEC
		};

		enum eWeekday {
			SUN = 0,  MON, TUE,
			WED, THU, FRI, SAT
		};
		
	public:
		inline AutoTime(time_t pTime = 0) : mTime(pTime), mBrokendown() {
		};

		inline const AutoTime& update(void) const {
			mTime = ::time(0);
			::localtime_r(&mTime, &mBrokendown);

			return *this;
		};
		
		inline time_t getTime(void) const {
			if(AUTO) update();
			
			return mTime;
		};

		inline uint getSecond(void) const {
			if(AUTO) update();

			return mBrokendown.tm_sec;
		};

		inline uint getMinute(void) const {
			if(AUTO) update();

			return mBrokendown.tm_min;
		};

		inline uint getHour(void) const {
			if(AUTO) update();

			return mBrokendown.tm_hour;
		};

		inline uint getDay(void) const {
			if(AUTO) update();

			return mBrokendown.tm_mday;
		};

		inline eMonth getMonth(void) const {
			if(AUTO) update();

			return (eMonth)mBrokendown.tm_mon;
		};

		inline uint getYear(void) const {
			if(AUTO) update();

			return mBrokendown.tm_year;
		};
	
		inline eWeekday getWeekday(void) const {
			if(AUTO) update();

			return (eWeekday)mBrokendown.tm_wday;
		};

		inline uint getYearday(void) const {
			if(AUTO) update();

			return mBrokendown.tm_yday;
		};
		
		inline String toString(const char *pFmt = TIME_FMT_DEFAULT) const {
			if(AUTO) update();

			char b[0x200];

			::strftime(b, sizeof(b), pFmt, &mBrokendown);

			return b;
		};

		// special instance
		static const AutoTime<true>	current;
		
	protected:
		mutable time_t		mTime;
		mutable struct tm	mBrokendown;
};

typedef AutoTime<false>	Time;

#endif// ? __AUTO_TIME_HPP_INCLUDED__
---- EOF --------------------------------------------------------------

$ cat AutoTime.cpp
#include "AutoTime.hpp"

const AutoTime<true>	Time::current;
---- EOF --------------------------------------------------------------

$ g++ -Wall -pedantic -c AutoTime.cpp
AutoTime.cpp:3: error: too few template-parameter-lists

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

мля, ну сказали же уже. нахера писать inline у методов, которые уже по определению являются inline?

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

Какой то нелепый класс получился, тебе так не кажется?

На мой взгяд он не должен быть шаблонным, либо делай две специализации,
либо откажись от габлога вообще, влаг auto можно выставлять и в
конструкторе. 

Я бы сделал так, отказался от шаблона, вместо него написал:

static AutoTime AutoTime::get_current()
{
    AutoTime at;
    return at.update();
}

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

я бы вообще отказался от класса такого :) сделал бы простую структурку broken_down_time, без поведения вообще, и создавал ее функцией break_down(time_t). зачем городить всякое.

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

> я бы вообще отказался от класса такого :) сделал бы простую структурку
> broken_down_time, без поведения вообще, и создавал ее функцией
> break_down(time_t). зачем городить всякое.

тогда уж struct tm

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

> template<> const AutoTime<true> Time::current;

спасибо.

Может класс действительно бесполезный.
Это так, в cpp упражняюсь ;-)

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