Re: typedef float float4[4]; std::vector<float4>; does not compile,
why?
On May 19, 6:34 pm, Jeff Schwab <j...@schwabcenter.com> wrote:
Brian Cole wrote:
On May 19, 2:01 am, SG <s.gesem...@gmail.com> wrote:
On 19 Mai, 00:12, Brian Cole <col...@gmail.com> wrote:
The following code will not compile in gcc 4.3.2 on Ubuntu 8.10
#include <vector>
typedef float float4[4];
int main()
{
std::vector<float4> vals;
}
As Alf said, float4 doesn't satisfy the vector templates'
requirements as a value type.
If your C++ implementation ships with the TR1 library
extension or you can install some TR1 implementation and/or
Boost you could solve this problem via:
typedef std::tr1::array<float,4> float4;
Apparently GCC considers this a bug (http://gcc.gnu.org/bugzilla/
show_bug.cgi?id=40192). So now I'm doubly confused.
It wasn't a bug. They should not have "fixed" it.
In C++03, it's a quality of implementation issue. The standard
says it's undefined behavior. And while the instantiation of
the vector works (I don't know why) in both g++ and VC++, you
can't do anything with it---none of the member functions work.
From a QoI point of view, the error should be detected by the
compiler if possible.
In C++0x, IIUC, it will require a diagnostic (unless arrays are
somehow MoveConstructable---I'm not too sure about the
implications of rvalue references with regards to arrays).
I'm not a language lawyer, is "float4" a pointer to an array
of 4 floats? Or is it an array of 4 floats?
It's an array (in your original post). C++ raw arrays decay
to pointers, but that's not something you should need to worry
about unless you're manually laying out memory. You almost
never should need a raw array. Forget about raw arrays.
Yes. In this context, as far as I can tell, the array doesn't
decay into a pointer. If it did, the template instantation
would be legal---but would be the exact equivalent of
std::vector< float* >.
About the only use for raw arrays I know is in order to obtain
static initialization and automatic calculation of the size.
Basically if we define float4_t
as "struct float4_t { float x,y,z,w; };" is std::vector<float4>
equivalent to std::vector<float4_t> or std::vector<float4_t *>.
Neither. std::vector<float[4]> shouldn't even be legal.
It isn't legal. It's undefined behavior.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34