Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаблонирование типов и операций над ними 
:(
    Опции темы
ANTON_AL
Дата 10.4.2007, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Добрый день!

Вот, хочу сделать шаблонный тип данных, который будет представлять действительное  число....

Параметры числа:
   * Carrier    - собственно тип, в котором будут храниться данные
   * DecPart  - кол-во разрядов для целой части
   * Count     - кол-во чисел, которые можно запихнуть в тип Carrier ( например, если Carrier = DWORD, то в него можно поместить 4 числа типа BYTE, т.к 32 = 8 + 8 + 8 + 8 ) Но это пока не важно, вопрос не в этом.


Вот код.


Код

template< class Carrier = int, int DecPart = 5, int Count = 1 >
//---------------------------------------------------------------------------------------
//Base class of Real Type
//---------------------------------------------------------------------------------------
class DSPRealType
{
    public:
        typedef Carrier    Carrier;
        int                    iCount;
        int                    iDecPart;
        
        DSPRealType( )
        {
            iCount    = Count;
            iDecPart = DecPart;
        }
};




template< DSPRealType Real >
//---------------------------------------------------------------------------------------
//
//---------------------------------------------------------------------------------------
class DSPReal
{
    public:
        DSPReal( Real::Carrier Val ) { m_Val = Val; }

        Real::Carrier getVal( ) const    { return m_Val; }


    private:
        Real::Carrier m_Val;
};




template < DSPRealType Left, DSPRealType Right >
//=======================================================================================
//+
//=======================================================================================
DSPReal<Left>
operator+ ( DSPReal<Left> &lhs, DSPReal<Right> &rhs )
{
    Left::Carrier temp;
    
    if ( Left::iDecPart < Right::iDecPart )
        temp = rhs.getVal() >> (Right::iDecPart - Left::iDecPart);
    else
        temp = rhs.getVal() << (Left::iDecPart - Right::iDecPart);


    return lhs.getVal() + temp;
}



Так будет происходит работа с этим типом, причём, в операциях должно выполняться правило: 
    TypeLeft = TypeLeft + TypeRight;
т.е результат операции такого типа, какой у левого операнда.

Код

#include <conio.h>


#define DSP_INT        DSPRealType< int,      5, 1 >
#define DSP_SHORT        DSPRealType< short, 5, 1 >





void main( )
{
    DSP_INT        objInt;
    DSP_SHORT    objShort;

    DSP_INT objResult = objInt + objShort;


    getch( );
}



Ну и наконец, проблема: компилятор выдаёт 16 ошибок, как с ними бороться, что не правильно ??



-----------------------------------------------------
С Уважением, Антон.

Это сообщение отредактировал(а) ANTON_AL - 10.4.2007, 14:18
PM MAIL   Вверх
JackYF
Дата 10.4.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(ANTON_AL @  10.4.2007,  14:15 Найти цитируемый пост)
компилятор выдаёт 16 ошибок,

Встроенным в мозг компилятором пока еще не обзавелись, поэтому выдай и ты нам эти 16 ошибок smile



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
ANTON_AL
Дата 10.4.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 292
Регистрация: 27.1.2007

Репутация: нет
Всего: нет



Ну если так проще, нежели создать проект и посмотреть, то вот:

Error    7    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int    real.h    32
Error    9    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int    real.h    32
Error    13    error C2993: 'DSPRealType' : illegal type for non-type template parameter 'Right'    real.h    88
Error    1    error C2993: 'DSPRealType' : illegal type for non-type template parameter 'Real'    real.h    29
Error    12    error C2993: 'DSPRealType' : illegal type for non-type template parameter 'Left'    real.h    84
Error    10    error C2864: 'DSPReal<Real>::m_Val' : only static const integral data members can be initialized within a class    real.h    32
Error    15    error C2783: 'DSPReal operator +(DSPReal &,DSPReal &)' : could not deduce template argument for 'Right'    main.cpp    35
Error    14    error C2783: 'DSPReal operator +(DSPReal &,DSPReal &)' : could not deduce template argument for 'Left'    main.cpp    35
Error    16    error C2676: binary '+' : 'DSPRealType<Carrier,DecPart,Count>' does not define this operator or a conversion to a type acceptable to the predefined operator    main.cpp    35
Error    2    error C2653: 'Real' : is not a class or namespace name    real.h    32
Error    3    error C2653: 'Real' : is not a class or namespace name    real.h    32
Error    8    error C2473: 'Val' : looks like a function definition, but there is no parameter list.    real.h    32
Error    5    error C2146: syntax error : missing ';' before identifier 'Val'    real.h    32
Error    11    error C2146: syntax error : missing ';' before identifier 'Real'    real.h    34
Error    4    error C2146: syntax error : missing ')' before identifier 'Val'    real.h    32
Error    6    error C2059: syntax error : ')'    real.h    32


Только о многом ли это скажет.... ??

Это сообщение отредактировал(а) ANTON_AL - 10.4.2007, 15:22
PM MAIL   Вверх
vinter
Дата 10.4.2007, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



я конешно может чего не знаю, но что означает следуtofz конструкция?
Код

template< DSPRealType Real >

а это че такое
Код

Real::Carrier Val 

что это за глубокомысленная конструкция??
Код

 typedef Carrier    Carrier;

короче, по моему тебе надо книжку повнимательнее почитать..


--------------------
Мой блог
PM MAIL WWW   Вверх
Xenon
Дата 10.4.2007, 16:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Что за жесть?  smile "Стою я на асфальте обутый - толи лыжи не едут, толи я ненормальный" ... Не понял я.
Судя по всему должно быть нечто такое?
Код

template <class Carrier = int, int DecPart = 5, int Count = 1>
//---------------------------------------------------------------------------------------
//Base class of Real Type
//---------------------------------------------------------------------------------------
class DSPRealType
{
    public:
        int                    iCount;
        int                    iDecPart;    
        DSPRealType( )
        {
            iCount    = Count;
            iDecPart = DecPart;
        }
};

template <class Real>
class DSPReal
{
    public:
        DSPReal(Real Val) { m_Val = Val; }
        typename Real getVal( ) const    { return m_Val; }
    private:
        typename Real m_Val;
};

template <class Left, class Right >
DSPReal<Left> operator+ (DSPReal<Left> &lhs, DSPReal<Right> &rhs)
{
    Left temp;
    
    if (iDecPart < Right::iDecPart )
        temp = rhs.getVal() >> (iDecPart - iDecPart);
    else
        temp = rhs.getVal() << (iDecPart - iDecPart);
    return lhs.getVal() + temp;
}


Это сообщение отредактировал(а) Xenon - 10.4.2007, 16:04


--------------------
user posted image  
PM MAIL   Вверх
Xenon
Дата 10.4.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Вообще что вообе за ... operator+ возвращает DSPReal и принимает DSPReal, хотя в main () у тебя участвуют DSPRealType как слева от = так и с обеих сторон от знака +. Если ты тут надеешься на неявное преобразование DSPReal в DSPRealType, то зря. Иначе я вообще не понял чего ты тут сделал - опеределил два класса, написал перегрузку оператора сложения для второго класса и пытаешься ее использоваться для первого класса, при чем не определив при этом операторов присваивания классу первого типа классу второго и преобразований


--------------------
user posted image  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0863 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.