0

Я пишу библиотеку для поддержки типа целых чисел, которые имеют два параметра шаблона INT_BITS и FRAC_BITS. Мне удалось написать функцию преобразования для преобразования различных типов классов из одного в другой [которые меняются в значениях INT_BITS и FRAC_BITS]. Но когда я пытаюсь использовать его при перегрузке оператора присваивания, он не работает. Пожалуйста, предложите мне способ его реализации. Я прошел через ссылки herehere и here, но ни одно из решений, похоже, не работает.Оператор перегрузки Назначение в классе шаблона

Определение класса:

template<int INT_BITS, int FRAC_BITS> 
struct fp_int 
{ 
public: 
    static const int BIT_LENGTH = INT_BITS + FRAC_BITS; 
    static const int FRAC_BITS_LENGTH = FRAC_BITS; 

private: 
    ValueType stored_val; 
}; 

Определение функции преобразования:

template <int INT_BITS_NEW, int FRAC_BITS_NEW> 
fp_int<INT_BITS_NEW, FRAC_BITS_NEW> convert() const 
{ 
    typedef typename fp_int<INT_BITS_NEW, FRAC_BITS_NEW>::ValueType TargetValueType; 

    return fp_int<INT_BITS_NEW, FRAC_BITS_NEW>::createRaw(
     CONVERT_FIXED_POINT< 
      ValueType, 
      TargetValueType, 
      (FRAC_BITS_NEW - FRAC_BITS), 
      (FRAC_BITS_NEW > FRAC_BITS) 
      >:: exec(stored_val)); 
} 

Определение оператора идет как:

template <int INT_BITS_NEW, int FRAC_BITS_NEW> 
fp_int<INT_BITS_NEW, FRAC_BITS_NEW> 
    operator =(fp_int<INT_BITS,FRAC_BITS> value) const 
{ 
    fp_int<INT_BITS_NEW,FRAC_BITS_NEW> a = value.convert<INT_BITS_NEW,FRAC_BITS_NEW>(); 
    return a; 
} 

Когда я пытаюсь это работает:

fp_int<8,8> a = 12.4; 
fp_int<4,4> b = a.convert<4,4>(); 

Но когда я пытаюсь это он показывает ошибку преобразования типа:

fp_int<8,8> a = 12.4; 
fp_int<4,4> b; 
b = a; 

Пожалуйста, скажите мне, где я неправильно.

+0

Операторы присваивания обычно должны принимать свой аргумент * по ссылке *. Кроме того, вы не * назначаете * в свой оператор присваивания, то есть вы не изменяете левый операнд. Это удивительно: это не соответствует поведению встроенного назначения. – dyp

+0

предоставьте [MCVE] (http://stackoverflow.com/help/mcve). –

+0

@ м.с. Пожалуйста, найдите файл в [repo_link] (https://github.com/coder-mike/FixedPoint/blob/master/fixed_point.hpp) –

ответ

1

Предположим, вы работаете с обычными классами, а не с шаблонами. У вас есть класс SomeType, и вы хотите иметь оператор присваивания для этого класса, чтобы объекты объекта типа OtherType можно было отнести к объектам этого класса. Так что-то вроде этого:

SomeType obj1; 
OtherType obj2; 
obj1 = obj; 

Для этой работы можно было бы написать оператор присваивания для SomeType как это:

SomeType& operator=(const OtherType& other) 
{ 
    // implementation... 

    return *this; 
} 

Преобразование это шаблоны, SomeType и OtherType являются реализациями одного и того же класса шаблона, но с различными параметрами шаблона. В этом случае SomeType становится fp_int<INT_BITS, FRAC_BITS> и OtherType становится чем-то вроде fp_int<DIFFERENT_INT_BITS, DIFFERENT_FRAC_BITS>.

Таким образом, ваш оператор должен выглядеть следующим образом:

template <int DIFFERENT_INT_BITS, int DIFFERENT_FRAC_BITS> 
fp_int<INT_BITS, FRAC_BITS>& 
    operator =(fp_int<DIFFERENT_INT_BITS, DIFFERENT_FRAC_BITS> value) 
{ 
    // proper implementation for an assignment operator 
} 

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

+0

- Большое спасибо, я наконец придумал реализацию и понял свою ошибку. –

Смежные вопросы