template
От: KoY  
Дата: 21.08.04 21:30
Оценка:
Почему не работает? — подскажите что исправить..


template<typename T> class comment
{
public:
    comment(T _T):m_T(_T)
    {
    }
    ~comment()
    {
    }
    friend std::ostream& operator<<(std::ostream& os, comment& cmnt);
private:
    typename T& m_T;
};

template<typename T>
std::ostream& operator<<(std::ostream& os, comment<T>& cmnt)
{
        return os << "// " << cmnt.m_T;
}

и соответсвенно попытка:

std::cout<<comment<int>(999);

апочему-то печатает не те цифры...
Re: template
От: _Winnie Россия C++.freerun
Дата: 21.08.04 23:16
Оценка:
Здравствуйте, KoY, Вы писали:

KoY>Почему не работает? — подскажите что исправить..


KoY>
KoY>    comment(T _T):m_T(_T)
KoY>    {
KoY>    }
KoY>    typename T& m_T;
KoY>};

KoY>апочему-то печатает не те цифры...
KoY>


Инициализируем ссылку временной ЛОКАЛЬНОЙ (_T)переменной. Может, ты имел ввиду "T m_T" или "comment(T &_T):m_T(_T)" ?
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: template
От: KoY  
Дата: 21.08.04 23:31
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Здравствуйте, KoY, Вы писали:


KoY>>Почему не работает? — подскажите что исправить..


KoY>>
KoY>>    comment(T _T):m_T(_T)
KoY>>    {
KoY>>    }
KoY>>    typename T& m_T;
KoY>>};

KoY>>апочему-то печатает не те цифры...
KoY>>


_W>Инициализируем ссылку временной ЛОКАЛЬНОЙ (_T)переменной. Может, ты имел ввиду "T m_T" или "comment(T &_T):m_T(_T)" ?


если написать такое —

int a = 999;
std::cout<<comment<int>(a);

тот же результат...

и конечно можно написать вместо
typename T& m_T;

T& m_T;

т.е. ссылка здесь должна быть ... можно и указатель ... результат будет ТОТ ЖЕ САМЫЙ — НЕПРАВИЛЬНЫЙ

т.е. я хочу получить ссылку(или указатель) на объект который УЖЕ существует
(мне не нужна КОПИЯ ОБЪЕКТА!!!) и по ссылке вывести в поток ...
Re[3]: template
От: _Winnie Россия C++.freerun
Дата: 22.08.04 01:25
Оценка: 3 (1)
Здравствуйте, KoY, Вы писали:
KoY>Здравствуйте, _Winnie, Вы писали:
_W>>Здравствуйте, KoY, Вы писали:

KoY>если написать такое -

KoY>int a = 999;
KoY>std::cout<<comment<int>(a);
Да, так и надо. Так ссылку на 999 создать нельзя, а на i можно.

KoY>т.е. я хочу получить ссылку(или указатель) на объект который УЖЕ существует

Тогда comment(T &_T):m_T(_T)
Только ссылку на 999 у тебя все равно не получится сделать. Так как это константа. Только на i.

Повторюсь,

KoY>>>[ccode]

KoY>>> comment(T _T):m_T(_T)
KoY>>> {
KoY>>> }
KoY>>> typename T& m_T;
KoY>>>};
_W>>Инициализируем ссылку временной ЛОКАЛЬНОЙ (_T)переменной

Надо: comment(T /**/&/**/_T):m_T(_T)
Правильно работающая программа — просто частный случай Undefined Behavior
Re: template
От: Павел Кузнецов  
Дата: 22.08.04 03:25
Оценка: 2 (1) +1
KoY:

> Почему не работает? — подскажите что исправить..


Или так:
template<typename T>
class comment
{
public:
     comment(const T& _T):m_T(_T)
     {
     }
     ~comment()
     {
     }
     template<typename U>
     friend std::ostream& operator<<(std::ostream& os, const comment<U>& cmnt);
private:
     /*typename*/ const T& m_T;
};

template<typename T>
std::ostream& operator<<(std::ostream& os, const comment<T>& cmnt)
{
     return os << "// " << cmnt.m_T;
}

или так:
template<typename T>
class comment;

template<typename T>
std::ostream& operator<<(std::ostream& os, const comment<T>& cmnt);

template<typename T>
class comment
{
public:
     comment(const T& _T):m_T(_T)
     {
     }
     ~comment()
     {
     }
     friend std::ostream& operator<< <T>(std::ostream& os, const comment<T>& cmnt);
private:
     /*typename*/ const T& m_T;
};

template<typename T>
std::ostream& operator<<(std::ostream& os, const comment<T>& cmnt)
{
     return os << "// " << cmnt.m_T;
}
Posted via RSDN NNTP Server 1.9 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: template
От: _Winnie Россия C++.freerun
Дата: 22.08.04 04:59
Оценка: 2 (1)
Здравствуйте, KoY, Вы писали:

И еще, не следует называть свои переменные со знака подчеркивания, да еще такими короткими именами — они считаются зарезервированными для тех, кто не пользуется этим правилом(Microsoft), и разработчиков компиляторов. Что касается конкретно _T — то в заголовочном файле windows <tchar.h> определен макрос "_T", а практически в любой большой полезной программе этот заголовок будет подключен.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[4]: template
От: KoY  
Дата: 22.08.04 07:20
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Надо: comment(T /**/&/**/_T):m_T(_T)


А вот за это благодарю

Да протупил я гол... запутался — просто не заметил...
Re[2]: template
От: KoY  
Дата: 22.08.04 07:22
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>KoY:


>> Почему не работает? — подскажите что исправить..


Да — действительно — забыл в конструкторе символ ссылки — это думаю была основная проблема..
Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.