• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Klasy szablonowe - problem

0 głosów
533 wizyt
pytanie zadane 30 września 2015 w C i C++ przez broda Początkujący (380 p.)
zamknięte 1 października 2015 przez event15

Witam. Uczę się C++ i mam pytanie:

Robię klasę szablonową i operatory (jest ich więcej, ale dla przejrzystości podałem tylko dwa).
Przy każdym z nich wyskakuje mi:  
error C2975: 'Zbior' : invalid template argument for 'N', expected compile-time constant expression   

 

Jak powinienem pisać templaty?
 

#include <bitset>
#include <string>
#include <string.h>

using namespace std;

template <int N=32>
class Zbior
{
	bitset<N> bity;

public:
//konstruktory

	template <class N>
	friend ostream& operator<<(ostream& os, const Zbior<N>& sb);


	template <class N>
	friend Zbior<N>& operator+( const Zbior<N>&, const Zbior<N>&);
};

template <class N>
ostream& operator<<(ostream& os, const Zbior<N>& zb)
{
	os<<"{";
	for (int i=0; i<zb.bity.size(); i++)
	{
		if (zb.bity[i]==1) 
			os<<i<<", ";
	}
	os<<"}"<<endl;
	return os;
}	


template <class N>
Zbior<N>& operator+( const Zbior<N>& a, const Zbior<N>& b)
{
	bitset<N> nowy_bitset= (a.bity | b.bity);
	string str=nowy_bitset.to_string();
	const char* strr=str.c_str();
	Zbior<N> nowy (strr);
	return nowy;
}

 

komentarz zamknięcia: problem rozwiązany

1 odpowiedź

0 głosów
odpowiedź 30 września 2015 przez adrian17 Mentor (355,240 p.)
wybrane 30 września 2015 przez broda
 
Najlepsza
<class N> -> <int N>
komentarz 1 października 2015 przez broda Początkujący (380 p.)
Class/typename używamy, gdy nie jest to int, char, char*, bool, tylko jakieś nasze zdefiniowane typy. Dobrze myślę?
komentarz 1 października 2015 przez adrian17 Mentor (355,240 p.)
Nie, class/typename używamy gdy argument szablonu jest typem, int/inny typy całkowite gdy jest to argument nie-typowy.
komentarz 1 października 2015 przez broda Początkujący (380 p.)
Co to jest typ i nie-typ? Podejrzewam, że to coś prostego, ale niezbyt to rozumiem i nie potrafię znaleźć dobrego wytłumaczenia...
komentarz 1 października 2015 przez adrian17 Mentor (355,240 p.)

Argument szablonu moze być albo typem (sztandarowym przykładem jest std::vector):

template<typename T> // lub <class T>, to to samo
class jakas_klasa;
(...)

jakas_klasa<float> obiekt;

Albo... czymś innym (co standard formalnie nazywa "nie-typowym argumentem szablonu"). Może to być wartość typu całkowitego (bool/char/int etc. Przykładem jest std::bitset):

template<int N>
class jakas_klasa;
(...)

jakas_klasa<123> obiekt;

Ale też enumeracje, a nawet wskaźniki/referencje do obiektów znanych podczas kompilacji (co znacząco ogranicza ich użyteczność i przez co są bardzo rzadko spotykane), na przykład: http://melpon.org/wandbox/permlink/EgDrtaFblnWZz3FM

komentarz 1 października 2015 przez broda Początkujący (380 p.)
Dlaczego vector jest typem, a bitset nie?
komentarz 1 października 2015 przez adrian17 Mentor (355,240 p.)
Źle mnie zrozumiałeś - miałem na myśli, że argumentem do szablonu vector<typename T> jest typ, a do bitset<int N> liczba.
komentarz 1 października 2015 przez broda Początkujący (380 p.)
Ok, rozumiem

Podobne pytania

0 głosów
2 odpowiedzi 494 wizyt
pytanie zadane 14 października 2015 w C i C++ przez 0xf Dyskutant (8,180 p.)
0 głosów
1 odpowiedź 302 wizyt
pytanie zadane 30 września 2015 w C i C++ przez broda Początkujący (380 p.)
0 głosów
2 odpowiedzi 535 wizyt

93,771 zapytań

142,731 odpowiedzi

323,383 komentarzy

63,372 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...