7

I'm getting the following compile error...

error C2536: 'Player::Player::indices' : cannot specify explicit initializer for arrays 

why is this?

header

class Player
{
public:
    Player();
    ~Player();

    float x;
    float y;
    float z;
    float velocity;

    const unsigned short indices[ 6 ];
    const VertexPositionColor vertices[];
};

cpp

Player::Player()
:
    indices
    { 
        3, 1, 0,
        4, 2, 1 
    },
    vertices{
        { XMFLOAT3( -0.5f, -0.5f, -0.5f ), XMFLOAT3( 0.0f, 0.0f, 0.0f ) },
        { XMFLOAT3( -0.5f, 0.5f, -0.5f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ) },
        { XMFLOAT3( 0.5f, -0.5f, -0.5f ), XMFLOAT3( 0.0f, 1.0f, 0.0f ) },
        { XMFLOAT3( 0.5f, 0.5f, -0.5f ), XMFLOAT3( 0.0f, 1.0f, 1.0f ) }
    }
{
}

EDIT TO SHOW MY ATTEMPT AT std::array

std::array<unsigned short, 6> indices;
std::array<VertexPositionColor, 4>  vertices;

can't get this to work either.

error C2661: 'std::array<unsigned short,6>::array' : no overloaded function takes 6 arguments

and if I do this in my construct like the other post says:

indices( { 
    3, 1, 0,
    4, 2, 1 
} ),
vertices ( {
    { XMFLOAT3( -0.5f, -0.5f, -0.5f ), XMFLOAT3( 0.0f, 0.0f, 0.0f ) },
    { XMFLOAT3( -0.5f, 0.5f, -0.5f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ) },
    { XMFLOAT3( 0.5f, -0.5f, -0.5f ), XMFLOAT3( 0.0f, 1.0f, 0.0f ) },
    { XMFLOAT3( 0.5f, 0.5f, -0.5f ), XMFLOAT3( 0.0f, 1.0f, 1.0f ) }
} )

it crashes the compiler...

EDIT:: Victory!

I put them in my cpp file babeh:

const unsigned short Player::indices[ 6 ] = {
    3, 1, 0,
    4, 2, 1
};

const VertexPositionColor Player::vertices[ 4 ] = {
    { XMFLOAT3( -0.5f, -0.5f, -0.5f ), XMFLOAT3( 0.0f, 0.0f, 0.0f ) },
    { XMFLOAT3( -0.5f, 0.5f, -0.5f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ) },
    { XMFLOAT3( 0.5f, -0.5f, -0.5f ), XMFLOAT3( 0.0f, 1.0f, 0.0f ) },
    { XMFLOAT3( 0.5f, 0.5f, -0.5f ), XMFLOAT3( 0.0f, 1.0f, 1.0f ) }
}
Jimmyt1988
  • 20,466
  • 41
  • 133
  • 233
  • What compiler are you using? – woolstar Jan 03 '14 at 00:24
  • I knew it... vs2013... that's the problem isn't it. how do I get around this, grr. – Jimmyt1988 Jan 03 '14 at 00:24
  • 1
    [MSDN](http://msdn.microsoft.com/en-us/library/9f53ks1w.aspx) says you will get this when: "A nonstatic array declared with the const specifier. This kind of array cannot be explicitly initialized." And this has been asked here before and a work-around was suggested: https://stackoverflow.com/questions/19877757/workaround-for-error-c2536-cannot-specify-explicit-initializer-for-arrays-in-vi – jpw Jan 03 '14 at 00:25
  • If I take the const off, this doesn't work either... same error. i'm in vs2013 for windows 8 – Jimmyt1988 Jan 03 '14 at 00:27
  • The advise on the msdn site is to make the members `static const` since you are hard coding them anyways. – woolstar Jan 03 '14 at 00:29
  • Does that mean I can just declare them in the class then? – Jimmyt1988 Jan 03 '14 at 00:30
  • The other workaround previously proposed is to use `std::array` – woolstar Jan 03 '14 at 00:31
  • I'm not sure how to use the std::array, could you help me out.. please see what I have so far(OP) – Jimmyt1988 Jan 03 '14 at 00:35
  • I have also tried the static declaration but I do not understand how to set the values for a static property? – Jimmyt1988 Jan 03 '14 at 00:45

2 Answers2

11

As everyone else was saying, set the properties of my class to static const and then define them in the cpp file for the class:

header file:

class Player
{
public:
    Player();
    ~Player();

    float x;
    float y;
    float z;
    float velocity;

    static const unsigned short indices[ 6 ];
    static const VertexPositionColor vertices[ 4 ];
};

cpp:

const unsigned short Player::indices[ 6 ] = {
    3, 1, 0,
    4, 2, 1
};

const VertexPositionColor Player::vertices[ 4 ] = {
    { XMFLOAT3( -0.5f, -0.5f, -0.5f ), XMFLOAT3( 0.0f, 0.0f, 0.0f ) },
    { XMFLOAT3( -0.5f, 0.5f, -0.5f ), XMFLOAT3( 0.0f, 0.0f, 1.0f ) },
    { XMFLOAT3( 0.5f, -0.5f, -0.5f ), XMFLOAT3( 0.0f, 1.0f, 0.0f ) },
    { XMFLOAT3( 0.5f, 0.5f, -0.5f ), XMFLOAT3( 0.0f, 1.0f, 1.0f ) }
}
Jimmyt1988
  • 20,466
  • 41
  • 133
  • 233
1

The size of the array needs to be defined in the class definition. C++ doesn't support variable sized arrays, at least, not yet:

class Player
{  
public:
    // ...
    const unsigned short indices[ 6 ];
    const VertexPositionColor vertices[4];
};

Assuming a suitable definition of VertexPositionColor this should be OK (it compiles with gcc and clang using -std=c++11).

Dietmar Kühl
  • 150,225
  • 13
  • 225
  • 380