tags:

views:

81

answers:

4

I'm trying to do the following:

I have:

std::vector<std::vector<GLdouble[2]>> ThreadPts(4);

then I try to do:

 GLdouble tmp[2];
  while(step--)
  {


   fx   += dfx;
   fy   += dfy;
   dfx  += ddfx;
   dfy  += ddfy;
   ddfx += dddfx;
   ddfy += dddfy;
   tmp[0] = fx;
   tmp[1] = fy;
   ThreadPts[currentvector].push_back(tmp);
  }

But the compiler says:

Error 15 error C2440: 'initializing' : cannot convert from 'const GLdouble [2]' to 'double [2]' C:\Program Files\Microsoft Visual Studio 9.0\VC\include\vector 1211

How could I do this then? I'm using VS 2008 and don;t have std::array, and I don't have boost.

Thanks

+2  A: 

A C-style array is not assignable, so it cannot be used as the value type of a vector.

If you are using Visual C++ 2008 SP1, you can #include <array> and use std::tr1::array.

Even if you don't want to use all of Boost, you should be able to simply copy the Boost Array header into your project and use it on its own; it doesn't rely on many other parts of Boost, and those on which it does rely can be easily removed.

James McNellis
Ok i'll use std::tr1::array thanks
Milo
A: 

You can use an inserter:

std::copy(tmp, tmp+2, std::back_inserter(ThreadPts[currentvector]));
Stephen
+2  A: 

Instead of a raw array of 2 members, wrap it in a struct like a Point:

struct Point {
   GLDouble[2] coords;

   void setCoordinates(GLDouble x, GLDouble y)
   {
     coords[0] = x;
     coords[1] = y;
   }

   /* consider adding constructor(s) and other methods here,
    * if appropriate
    */
};

std::vector<std::vector<Point>> ThreadPts(4);

while(step--)
{
  fx   += dfx;
  fy   += dfy;
  dfx  += ddfx;
  dfy  += ddfy;
  ddfx += dddfx;
  ddfy += dddfy;

  Point p;
  p.setCoordinates(fx,fy);
  ThreadPts[currentvector].push_back(p);
}

It takes the same amount of memory as a 2-element array, and has more readable semantics than an array.

Jason S
OpenGL wouldn't like this....
Milo
Agreed that this could be more readable in some scenarios, however, the array has the advantage of guaranteeing no padding between its elements, which is useful if the array has to be passed to another API (like OpenGL).
James McNellis
Edited to reflect wrapping in an array.
Jason S
A: 

You could also use a std::pair

std::vector<std::vector<std::pair<GLdouble[2],GLdouble[2]> > >  ThreadPts(4);
Falmarri