| McAffey Temat założony przez niniejszego użytkownika | Struktura jako argument domniemany funkcji » 2013-04-13 06:04:06 Witam. Skoro nigdzie nie znalazłem takiego wykorzystania, to pewnie odpowiedź jest przecząca, ale co mi szkodzi upewnić się Was, starych wyjadaczy - czy da się zastosować strukturę jako argument domniemany funkcji ? Kompilator w przypadku argumentu funkcji, nie godzi się na stosowanie standardowego przypisania wstępnej wartości strukturze (x = {1, 2}), a nie przychodzi mi do głowy inny sposób na wykonanie inizjalizacji struktury. Wydaje mi się, że nie da się tego wykonać, ale już nie raz używałem takiego zwrotu "wydaje mi się", a potem wielokrotnie pokazywaliście mi, że "tylko mi się wydaje", i po prostu brak mi doświadczenia, dlatego pytam ;) Z góry dzięki :) | 
|  | 
| pekfos | » 2013-04-13 11:03:25 Masz na myśli wartość domyślną argumentu? #include <iostream>
 struct a
 {
 int x, y;
 };
 
 void f( a b = { 1, 2 } )
 {
 std::cout << b.x << " " << b.y;
 }
 
 int main()
 {
 f();
 }
Kompiluje się i działa (GCC 4.7.2). | 
|  | 
| McAffey Temat założony przez niniejszego użytkownika | » 2013-04-13 11:45:38 Hmm, to może dzięki temu że masz nowszy, ja sprawdzałem na GCC 4.4.1  i GCC 4.6.2  i na obu dostawałem błąd kompilacji : error: expected primary-expression before '{' tokenerror: expected ')' before '{' token
 No nic, chyba zostaje mi zaktualizować kompilator :) | 
|  | 
| DejaVu | » 2013-04-13 12:39:57 Jeżeli masz włączoną obsługę standardu C++11 to być może zadziała wspomniany zapis.
 /edit:
 Pod Visual C++ 1012 nie działa, więc jest to raczej rozszerzenie kompilatora GCC 4.7.2.
 | 
|  | 
| Elaine | » 2013-04-13 15:21:15 To nie jest rozszerzenie, to wina kompilatora Microsoftu, który ma tylko częściową obsługę C++. Według standardu jest to poprawne; GCC (które od 4.8.1 ma pełną obsługę) i Clang (któremu niewiele brakuje) nie mają z tym problemu. | 
|  | 
| Monika90 | » 2013-04-13 16:20:24 Można problem rozwiązać na wiele sposobów: 1. Zdefiniować konstruktor struct S{
 int x, y, z;
 S( int x, int y, int z )
 : x( x )
 , y( y )
 , z( z )
 { }
 };
 
 void f( S s = S( 1, 2, 3 ) );
 
2. Zdefiniować stałą struct S { int x, y, z; };
 const S default_s = { 1, 2, 3 };
 
 void f( S s = default_s );
 
3. Przeciążyć funkcję struct S { int x, y, z; };
 void f( S s );
 inline void f() { S s = { 1, 2, 3 }; f( s ); }
 
 | 
|  | 
| « 1 » |