title: SFML C++ union constructor is implicitly deleted because the default definition would be ill formed
body: <p>I have been trying to solve this problem for 3 hours but i cant. I am trying to learn c++ but i am stuck here. I don't know the problem. I was trying to create an object pool to use with my bullet objects so i could spawn and despawn them easily without memory leak. My source is as follows:</p>
  
  <p>main.cpp </p>
  
  <p>--the first error is in the constructor of the Bullet class and the update method of the BulletPool class.</p>
  
  <pre><code>#include &lt;SFML/Graphics.hpp&gt;
  #include &lt;stdio.h&gt;
  #include &lt;time.h&gt;
  #include &lt;assert.h&gt;
  
  #include "bullets.hpp"
  #include "enemies.hpp"
  
  BulletPool::BulletPool() { //no matching function for call to 'Bullet::Bullet()'
    // The first one is available.
    firstAvailable_ = &amp;bullets_[0];
  
    // Each particle points to the next.
    for (int i = 0; i &lt; POOL_SIZE - 1; i++)
    {
      bullets_[i].setNext(&amp;bullets_[i + 1]);
    }
  
    // The last one terminates the list.
    bullets_[POOL_SIZE - 1].setNext(NULL);
  }
  
  
  Bullet::Bullet(sf::Vector2f pos, sf::Color color, float bullet_radius, bool enemy, sf::Vector2f vel) { //  candidate expects 6 arguments, 0 provided
      onScreen_=true;
      inUse = true;
      state_.live.enemy_ = enemy;
      state_.live.velocity_ = vel;
      shape.setRadius(bullet_radius);
      shape.setOrigin(bullet_radius, bullet_radius);
      shape.setFillColor(color);
      shape.setPosition(pos);
  }
  
  void Bullet::update(sf::Vector2f screen) {
      shape.move(state_.live.velocity_);
      if((shape.getGlobalBounds().top &lt;  0 || shape.getGlobalBounds().top &gt; 200/*screen.y*/ )&amp;&amp; !state_.live.enemy_) {
          onScreen_ = false;
      }
  
      if(!onScreen_) {
          inUse = false;
      }
  }
  void BulletPool::create(sf::Vector2f pos, sf::Color color, float bullet_radius, bool enemy, sf::Vector2f vel) {
  
      assert(firstAvailable_ != NULL);
  
      Bullet* newBullet = firstAvailable_;
      firstAvailable_ = newBullet-&gt;getNext();
      newBullet = new Bullet(pos,color,bullet_radius,enemy,vel);
  
      // Find an available particle.
      /*for (int i = 0; i &lt; POOL_SIZE; i++) {
  
          if (!bullets_[i].inUse()) {
  
              bullets_[i].init(pos,color,bullet_radius,enemy,vel);
              return;
          }
      }*/
  }
  
  void BulletPool::update(sf::RenderWindow window) { //initializing argument 1 of 'void BulletPool::update(sf::RenderWindow)'
      for (int i = 0; i &lt; POOL_SIZE; i++) {
          if (!bullets_[i].inUse) {
            // Add this particle to the front of the list.
            bullets_[i].setNext(firstAvailable_);
            firstAvailable_ = &amp;bullets_[i];
          } else {
              window.draw(bullets_[i].shape);
          }
      }
  }
  Enemy::~Enemy() {};
  RedShip::RedShip(sf::Vector2f pos,float side_ln) {
      movement = 10;
      shape.setPointCount(6);
      shape.setPoint(0, sf::Vector2f(side_ln/2, 0));
      shape.setPoint(1, sf::Vector2f(side_ln*3/8,side_ln*3/8));
      shape.setPoint(2, sf::Vector2f(0,side_ln*1/8));
      shape.setPoint(3, sf::Vector2f(side_ln/2,side_ln));
      shape.setPoint(4, sf::Vector2f(side_ln,side_ln*1/8));
      shape.setPoint(5, sf::Vector2f(side_ln*5/8,side_ln*3/8));
      shape.setFillColor(sf::Color::Transparent);
      shape.setOutlineColor(sf::Color::Red);
      shape.setOutlineThickness(5);
      shape.setOrigin(side_ln/2, sqrt((3*side_ln*side_ln)/4));
      shape.setPosition(pos);
  }
  
  void RedShip::update(float base_time, BulletPool bullets) {
      if(movement &gt; 1) {
          shape.move(3,1.5);
          movement--;
      }
      else if(movement &lt; -1) {
          shape.move(-3,1.5);
          movement++;
      }
      else if(movement == -1)
          movement = 30;
      else
          movement = -30;
  
      if(fmod(base_time,20)==0) {
      bullets.create({shape.getPosition().x, shape.getPosition().y + shape.getLocalBounds().height/2}, sf::Color::Red, 4,true, {0,6});
      }
  }
  
  
  GreenShip::GreenShip(sf::Vector2f pos, float side_ln) {
      movement={};
      shape.setPointCount(8);
      shape.setPoint(0, sf::Vector2f(0, 0));
      shape.setPoint(1, sf::Vector2f(0,side_ln*2/3));
      shape.setPoint(2, sf::Vector2f(side_ln/2,side_ln));
      shape.setPoint(3, sf::Vector2f(side_ln,side_ln*2/3));
      shape.setPoint(4, sf::Vector2f(side_ln,0));
      shape.setPoint(5, sf::Vector2f(side_ln*3/4,side_ln/2));
      shape.setPoint(6, sf::Vector2f(side_ln/2,side_ln*3/8));
      shape.setPoint(7, sf::Vector2f(side_ln*1/4,side_ln/2));
      shape.setFillColor(sf::Color::Transparent);
      shape.setOutlineColor(sf::Color::Green);
      shape.setOutlineThickness(5);
      shape.setOrigin(side_ln/2, sqrt((3*side_ln*side_ln)/4));
      shape.setPosition(pos);
  }
  
  void GreenShip::update(float base_time,BulletPool bullets) {
  
      shape.move(0,1);
  
      if(fmod(base_time,60)==0) {
      //bullets.push_back(new Bullet({shape.getPosition().x, shape.getPosition().y + shape.getLocalBounds().height/2 + 4}, sf::Color::Green, 4,true, 2));
      }
  }
  
  class Core {
  public:
      const float core_velocity{5};
      int bullet_count{0};
  
      sf::ConvexShape shape;
      sf::Vector2f velocity;
  
      Core(float sX, float sY, float scale) {
          shape.setPointCount(12);
          shape.setPoint(0,{scale/2,0});
          shape.setPoint(1,{scale*7/16,scale*2/16});
          shape.setPoint(2,{scale*6/16,scale*4/16});
          shape.setPoint(3,{scale*5/16,scale*7/16+scale/3});
          shape.setPoint(4,{0,scale*10/16+scale/2});
          shape.setPoint(5,{0,scale*13/16+scale/3});
          shape.setPoint(6,{scale*8/16,scale*10/16+scale/3});
          shape.setPoint(7,{scale,scale*13/16+scale/3});
          shape.setPoint(8,{scale,scale*10/16+scale/2});
          shape.setPoint(9,{scale*11/16,scale*7/16+scale/3});
          shape.setPoint(10,{scale*10/16,scale*4/16});
          shape.setPoint(11,{scale*9/16,scale*2/16});
          shape.setFillColor(sf::Color::Transparent);
          shape.setOutlineColor(sf::Color::White);
          shape.setOutlineThickness(7);
          shape.setOrigin(scale/2, scale/2);
          shape.setPosition(sX, sY);
      }
  
      void update() {
  
          if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
              velocity.x = -core_velocity;
          else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
              velocity.x = core_velocity;
          else
              velocity.x = 0;
  
          if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
              velocity.y = -core_velocity;
          else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
              velocity.y = core_velocity;
          else
              velocity.y = 0;
  
          shape.move(velocity);
  
      }
  
      void fire(BulletPool bullets) {
          if(bullet_count &lt; 3) {
              bullets.create({shape.getPosition().x, shape.getPosition().y-shape.getLocalBounds().height/2 -1}, sf::Color::White, 6,false,{0,-8});
              bullet_count++;
          }
      }
  };
  
  
  int main(int argc, char *argv[]) {
  
      const sf::Vector2f res{480,640};
      printf("Religion ist das Opium des Volkes.\n                -Marx\n");
      sf::RenderWindow window(sf::VideoMode(res.x,res.y), "Brick Breaker", sf::Style::None);
  
      float base_time{0};
      Core core(res.x / 2, res.y /2 + 200, 64);
      GreenShip ship({res.x/2,50},50);
      GreenShip ship1({res.x/2+100,50},50);
      BulletPool bullets;
      //std::vector&lt;Enemy*&gt; enemies;
  
  
      while (window.isOpen())
      {
          sf::Event event;
          while (window.pollEvent(event))
          {
              switch (event.type)
                  {
  
                      case sf::Event::Closed:
                          window.close();
                          break;
  
                      case sf::Event::KeyPressed:
                          switch (event.key.code) {
  
                              case sf::Keyboard::Q:
                                  core.fire(bullets);
                                  break;
  
                              case sf::Keyboard::Escape:
                                  window.close();
                                  break;
  
                              default:
                                  break;
                          }
                          break;
  
                      default:
                          break;
          }
          }
  
          if(base_time&lt;3600)
              base_time++;
          else
              base_time=0;
  
          window.clear();
          window.setFramerateLimit(60);
  
          core.update();
          window.draw(core.shape);
  
          ship.update(base_time,bullets);
          window.draw(ship.shape);
  
          ship1.update(base_time,bullets);
          window.draw(ship1.shape);
  
          bullets.update(window); //use of deleted function 'sf::RenderWindow::RenderWindow(const sf::RenderWindow&amp;)'
  
          /*for(auto&amp; b : bullets) {
              if(!b-&gt;onScreen) {
                  core.bullet_count--;
              }
              else {
                  window.draw(b-&gt;shape);
                  b-&gt;update(res,base_time,bullets);
              }
          }*/
          window.display();
      }
  
      return 0;
  }
  </code></pre>
  
  <p>enemies.hpp (no errors in this one)</p>
  
  <pre><code>#ifndef ENEMIES_HPP
  #define ENEMIES_HPP
  
  class Enemy{
  public:
      sf::ConvexShape shape;
      int movement;
      virtual void update(float base_time, BulletPool bullets) = 0;
      virtual ~Enemy() = 0;
  };
  
  
  
  class RedShip: public Enemy{
  public:
      RedShip(sf::Vector2f pos, float side_ln);
      void update(float base_time, BulletPool bullets);
  };
  
  class GreenShip: public Enemy{
  public:
      GreenShip(sf::Vector2f pos, float side_ln);
      void update(float base_time, BulletPool bullets);
  };
  
  
  
  #endif
  </code></pre>
  
  <p>bullets.hpp</p>
  
  <pre><code>#ifndef BULLETS_HPP
  #define BULLETS_HPP
  
  class Bullet{ //Bullet::Bullet(Bullet&amp;&amp;)// CANT UNDERSTAND WHY THIS POPS UP
  public:
      sf::CircleShape shape;
      Bullet(); //unless i add this constructor it gives the error below↓
      Bullet* getNext() const { return state_.next_; }
      void setNext(Bullet* next) { state_.next_ = next; }
      Bullet(sf::Vector2f pos, sf::Color color, float bullet_radius, bool enemy, sf::Vector2f vel); //Bullet::Bullet(sf::Vector2f, sf::Color, float, bool, float, float)
      void update(sf::Vector2f screen);
      bool inUse;
  
  private:
      bool onScreen_=true;
      union { //'Bullet::&lt;anonymous union&gt;::&lt;constructor&gt;()' is implicitly deleted because the default definition would be ill-formed:
          struct {
          bool enemy_;
          sf::Vector2f velocity_;
          } live; //union member 'Bullet::&lt;anonymous union&gt;::live' with non-trivial 'Bullet::&lt;anonymous union&gt;::&lt;anonymous struct&gt;::&lt;constructor&gt;()'
  
          Bullet *next_;
  
      } state_;
  };
  
  class BulletPool{
  public:
      BulletPool();
      void create(sf::Vector2f pos, sf::Color color, float bullet_radius, bool enemy, sf::Vector2f vel);
      void update(sf::RenderWindow window);
  
  private:
    static const int POOL_SIZE = 100;
    Bullet bullets_[POOL_SIZE];
    Bullet* firstAvailable_;
  };
  
  #endif
  </code></pre>
  
  <p>All errors as they are shown in eclipse:</p>
  
  <pre><code>[solved]use of deleted function 'Bullet::&lt;anonymous union&gt;::&lt;constructor&gt;()'
  
  initializing argument 1 of 'void BulletPool::update(sf::RenderWindow)'
  
  use of deleted function 'sf::RenderWindow::RenderWindow(const sf::RenderWindow&amp;)'
  
  'Bullet::&lt;anonymous union&gt;::&lt;constructor&gt;()' is implicitly deleted because the default definition would be ill-formed:
  
  union member 'Bullet::&lt;anonymous union&gt;::live' with non-trivial 'Bullet::&lt;anonymous union&gt;::&lt;anonymous struct&gt;::&lt;constructor&gt;()'
  </code></pre>
  
  <p>compiler log(mingw g++):</p>
  
  <pre><code>10:22:57 **** Incremental Build of configuration Debug for project Black Lambda ****
  Info: Configuration "Debug" uses tool-chain "MinGW GCC" that is unsupported on this system, attempting to build anyway.
  Info: Internal Builder is used for build
  g++ -std=c++0x -DSFML_STATIC -D__GX_EXPERIMENTAL_CXX_0X__ -D_cplusplus=201103L "-IC:\\SFML-2.3.2\\include" -O0 -g3 -Wall -c -fmessage-length=0 -o main.o "..\\main.cpp" 
  ..\main.cpp: In constructor 'Bullet::Bullet(sf::Vector2f, sf::Color, float, bool, sf::Vector2f)':
  ..\main.cpp:24:100: error: use of deleted function 'Bullet::&lt;anonymous union&gt;::&lt;constructor&gt;()'
   Bullet::Bullet(sf::Vector2f pos, sf::Color color, float bullet_radius, bool enemy, sf::Vector2f vel) {
                                                                                                      ^
  In file included from ..\main.cpp:6:0:
  ..\bullets.hpp:16:8: note: 'Bullet::&lt;anonymous union&gt;::&lt;constructor&gt;()' is implicitly deleted because the default definition would be ill-formed:
    union {
          ^
  ..\bullets.hpp:20:5: error: union member 'Bullet::&lt;anonymous union&gt;::live' with non-trivial 'Bullet::&lt;anonymous union&gt;::&lt;anonymous struct&gt;::&lt;constructor&gt;()'
     } live;
       ^
  ..\main.cpp: In function 'int main(int, char**)':
  ..\main.cpp:261:30: error: use of deleted function 'sf::RenderWindow::RenderWindow(const sf::RenderWindow&amp;)'
           bullets.update(window);
                                ^
  In file included from C:\SFML-2.3.2\include/SFML/Graphics.hpp:47:0,
                   from ..\main.cpp:1:
  C:\SFML-2.3.2\include/SFML/Graphics/RenderWindow.hpp:44:25: note: 'sf::RenderWindow::RenderWindow(const sf::RenderWindow&amp;)' is implicitly deleted because the default definition would be ill-formed:
   class SFML_GRAPHICS_API RenderWindow : public Window, public RenderTarget
                           ^
  C:\SFML-2.3.2\include/SFML/Graphics/RenderWindow.hpp:44:25: error: use of deleted function 'sf::Window::Window(const sf::Window&amp;)'
  In file included from C:\SFML-2.3.2\include/SFML/Window.hpp:42:0,
                   from C:\SFML-2.3.2\include/SFML/Graphics.hpp:32,
                   from ..\main.cpp:1:
  C:\SFML-2.3.2\include/SFML/Window/Window.hpp:57:23: note: 'sf::Window::Window(const sf::Window&amp;)' is implicitly deleted because the default definition would be ill-formed:
   class SFML_WINDOW_API Window : GlResource, NonCopyable
                         ^
  In file included from C:\SFML-2.3.2\include/SFML/System/FileInputStream.hpp:34:0,
                   from C:\SFML-2.3.2\include/SFML/System.hpp:35,
                   from C:\SFML-2.3.2\include/SFML/Window.hpp:32,
                   from C:\SFML-2.3.2\include/SFML/Graphics.hpp:32,
                   from ..\main.cpp:1:
  C:\SFML-2.3.2\include/SFML/System/NonCopyable.hpp:67:5: error: 'sf::NonCopyable::NonCopyable(const sf::NonCopyable&amp;)' is private
       NonCopyable(const NonCopyable&amp;);
       ^
  In file included from C:\SFML-2.3.2\include/SFML/Window.hpp:42:0,
                   from C:\SFML-2.3.2\include/SFML/Graphics.hpp:32,
                   from ..\main.cpp:1:
  C:\SFML-2.3.2\include/SFML/Window/Window.hpp:57:23: error: within this context
   class SFML_WINDOW_API Window : GlResource, NonCopyable
                         ^
  In file included from C:\SFML-2.3.2\include/SFML/Graphics.hpp:47:0,
                   from ..\main.cpp:1:
  C:\SFML-2.3.2\include/SFML/Graphics/RenderWindow.hpp:44:25: error: use of deleted function 'sf::RenderTarget::RenderTarget(const sf::RenderTarget&amp;)'
   class SFML_GRAPHICS_API RenderWindow : public Window, public RenderTarget
                           ^
  In file included from C:\SFML-2.3.2\include/SFML/Graphics.hpp:45:0,
                   from ..\main.cpp:1:
  C:\SFML-2.3.2\include/SFML/Graphics/RenderTarget.hpp:51:25: note: 'sf::RenderTarget::RenderTarget(const sf::RenderTarget&amp;)' is implicitly deleted because the default definition would be ill-formed:
   class SFML_GRAPHICS_API RenderTarget : NonCopyable
                           ^
  In file included from C:\SFML-2.3.2\include/SFML/System/FileInputStream.hpp:34:0,
                   from C:\SFML-2.3.2\include/SFML/System.hpp:35,
                   from C:\SFML-2.3.2\include/SFML/Window.hpp:32,
                   from C:\SFML-2.3.2\include/SFML/Graphics.hpp:32,
                   from ..\main.cpp:1:
  C:\SFML-2.3.2\include/SFML/System/NonCopyable.hpp:67:5: error: 'sf::NonCopyable::NonCopyable(const sf::NonCopyable&amp;)' is private
       NonCopyable(const NonCopyable&amp;);
       ^
  In file included from C:\SFML-2.3.2\include/SFML/Graphics.hpp:45:0,
                   from ..\main.cpp:1:
  C:\SFML-2.3.2\include/SFML/Graphics/RenderTarget.hpp:51:25: error: within this context
   class SFML_GRAPHICS_API RenderTarget : NonCopyable
                           ^
  ..\main.cpp:64:6: error:   initializing argument 1 of 'void BulletPool::update(sf::RenderWindow)'
   void BulletPool::update(sf::RenderWindow window) {
        ^
  
  10:22:59 Build Finished (took 1s.427ms)
  </code></pre>
  
  <p>I am just trying to learn c++ so
  ANY HELP or critism IS APPRECIATED, THANKS!</p>
  
  <p><strong>EDIT</strong>
  thanks a lot for all the help. i figured all of the problems out.
  The problem with BulletPool::update was that the renderwindow object was being passed without a reference causing the function to copy the window and thus not render.</p>