Szablony funkci w szablonach klas

0

Witam

#include <iostream>
using namespace std;

template <class T, int _s>
class Test
{
      T tab[_s];
 public:
      Test(T a=0)
      {
           for(int i=0; i<_s; i++)
               tab[i] = a;
      }
      
      Test<T,_s> operator++(int)
      {
           Test<T,_s> res(*this);
           for(int i=0; i<_s; i++)
               tab[i]++;
           return res;
      }
      
      Test<T,_s> operator-(Test<T,_s>& B) const
      {
           Test<T,_s> res;
           for(int i=0; i<_s; i++)
               res.tab[i] = tab[i] - B.tab[i];
           return res;
      }
      
      Test<T,_s>& operator=(Test<T,_s>& B) const
      {
           for(int i=0; i<_s; i++)
               tab[i] = B.tab[i];
           return *this;
      }
};

int main()
{
    Test<unsigned int, 100> X, A(5), B(A); // 5 – wypełnienie tablicy wartością
    A = (B++) - A;
    //cout << A << end;
    //Test X = A[0];
}
  

Co tutaj robię źle i jak to powinno wyglądać?
Dzięki

0

Tzn. chodzi ci o błąd czy jakiś zły styl pisania? Z kompilacji wynikło, że przy operator przypisania nie może być stały.

0

Mi DEV wyrzuca:
42 C:\Users\Matt\Desktop\Szubi\zaliczeniówka\kolosy5.cpp no match for 'operator=' in 'A = (&(&B)->Test<T, _s>::operator++ [with T = unsigned int, int _s = 100](0))->Test<T, _s>::operator- [with T = unsigned int, int _s = 100](((Test<unsigned int, 100>&)(&A)))'

0
  1. wywal DEV-a.

  2. komunikaty GCC nie należą do najczytelniejszych… może to ci coś podpowie (Visual C++ 2010):

a.cpp(34) : error C2166: l-value specifies const object
        a.cpp(32) : while compiling class template member function 'Test<T,_s> &Test<T,_s>::operator =(Test<T,_s> &) const'
        with
        [
            T=unsigned int,
            _s=100
        ]
        a.cpp(41) : see reference to class template instantiation 'Test<T,_s>' being compiled
        with
        [
            T=unsigned int,
            _s=100
        ]
a.cpp(35) : error C2440: 'return' : cannot convert from 'const Test<T,_s>' to 'Test<T,_s> &'
        with
        [
            T=unsigned int,
            _s=100
        ]
        Conversion loses qualifiers

albo Clang:

a.cpp:42:7: error: no viable overloaded '='
    A = (B++) - A;
    ~ ^ ~~~~~~~~~
a.cpp:31:19: note: candidate function not viable: no known conversion from 'Test<unsigned int, 100>' to
      'Test<unsigned int, 100> &' for 1st argument;
      Test<T,_s>& operator=(Test<T,_s>& B) const
                  ^
1 error generated.
0

2 rzeczy:
1: metoda zadeklarowana jako const oznacza, że jej wywołanie nie modyfikuje pól składowych, ani nie są wywoływane inne metody nie const.
2: wynikiem odejmowania jest obiekt stały, a Ty w operatorze przypisania żądasz niestałego obiektu.

0

@Karolaq dzięki - pomogło :)
A tak w ogóle to dlaczego wynik odejmowania jest stały?

1 użytkowników online, w tym zalogowanych: 0, gości: 1