String jako argument funkcji o zmiennej liczności

0

Dobry wieczór, mam pewien problem - mam funkcję o zmiennej liczności (na razie chce zapisać stringi będące argumentami do pomocniczej tablicy w funkcji, której będę potem używał) i muszę przekazać do niej pewną ilość stringów. W takiej postaci program się nie kompiluje i wywala mi błąd - [Error] cannot pass objects of non-trivially-copyable type 'std::string {aka class std::basic_string<char>}' through '...' w miejscu wywołania funkcji. Jeśli zamienię "tablica[0]" na "tablica[0].c_str()" to program się kompiluje, ale i tak nie działa poprawnie. Ponadto w wywołaniu funkcji wątpię by było używane .c_str() ( wymóg zadania, nie moje widzimisie), więc muszę się bez tego obejść i tak. Więc jaki tu jest problem i jak mogę go rozwiązać??

string sum( int iloscLiczb, ... )
	{
		va_list ap;
		va_start ( ap, iloscLiczb );
		string tablica[iloscLiczb];
		for ( int i = 0; i < iloscLiczb; i++ )
			{
				char* s = va_arg( ap, char * );
				tablica[i] = s;
			}	
	}

int main()
	{
		int liczbaCyfr;
		cin >> liczbaCyfr;
		string tablica[liczbaCyfr];
		for ( int i = 0; i < liczbaCyfr; i++ )
			{
				cin >> * ( tablica + i ) ;
			}
		//cout << sum( liczbaCyfr, tablica );
		cout << sum ( liczbaCyfr, tablica[0], tablica[1]) ;
		return 0;
	}
1

Nie możesz tak zrobić. Nie możesz przekazać tablicy tylko obiekty po przecinku. Nie możesz przekazywać obiektów tylko prymitywy / wskaźniki.

0

@kochambacę Pozdrawia :) @Shalom W sumie tablica jest tylko pomocnicza, wszystko rozchodzi się o stringi, o konkretne obiekty... Nie mogę przekazać do funkcji konkretnego elementu tablicy? Czy nva_arg nie może być elementem tablicy...? Co to są prymitywy to nie wiem, więc gdzie mogę przekazywać obiekty a gdzie tylko wskaźniki i prymitywy?

0

Tablica nie jest tu problemem. Problemem jest typ obiektu. Nie możesz tam wrzucić obiektów klas. Tylko typy prymitywne.

0

Ellipsis (czyli ...) działa tylko dla POD (plain old data) i pointerów. Pchanie do ellipsis czegokolwiek, co nie jest POD wcześniej (przed c++11) oznaczało undefined behaviour, teraz oznacza zależność od użytego kompilatora (jego implementacji). Jeśli zależy Ci na przesyłaniu do funkcji zmiennoargumentowej typów non-POD to użyj variadic template.
Co do zadania.... to nie rozumiem jakie jest polecenie. Może wyjaśnij co chcesz osiągnąć.

0

Czemu nie możesz zrobić to po ludzku:

string sum(vector<string> &tb)
  {
   for(int i=0;i<tb.size();++i) cout<<tb[i]<<endl;
  }

int main()
  {
   size_t count;
   cin>>count;
   vector<string> tb(count);
   for(int i=0;i<tb.size();++i) cin>>tb[i];
   cout<<sum(tb);
   return 0;
  }
0

Chodzi o to, by móc do funkcji wprowadzić odpowiednią ilość stringów, ciągów znaków, funkcja musi mieć nieokreśloną liczbę argumentów, dlatego Twoja propozycja Dragon odpada, bo to musi mieć jednego inta i potem tą nieokreśloną ilość argumentów...Ogólnie to funkcja ma sumować wielkie liczby z użyciem właśnie stringów, ale to nie jest tu problemem bo już metodę mam. Chodzi tylko o tą funkcję, ma ona właśnie tak wyglądać ** sum( int, ... ) ** . Więc jak mam to zrobić w takim razie, jak nie mogę tam stringów wsadzić bezpośrednio...? Ech.

Edit: tablice charów wejdą?

0

Skąd ten mus?
Ta funkcja string sum(vector<string> &tb) może sobie zsumować te liczby.

0

Cóż, z treści zadania... Ech, nie mam biegłości w używaniu vectorów, nie wiem czy można ich w ogóle używać, ale spróbuje, dzięki za pomoc.

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