39

Is there any reason why codeblocks is telling me that I can't make an array? I'm simply trying to do:

const unsigned int ARRAY[10] = {0,1,2,3,4,5,6,7,8,9}; 

and it's giving me

error: a brace-enclosed initializer is not allowed here before '{' token

I have changed other parts of the initializer, but the error is always saying the same thing. This doesn't seem to make sense, since this is one of the first things I learned in c++.

11
  • 4
    We need a context in which that appears (surrounding code). Commented May 17, 2011 at 20:09
  • 1
    This line, in isolation, compiles just fine. Please create a Short, Self-contained, Complete Example (sscce.org). Without more context, we cannot tell you what is wrong. Commented May 17, 2011 at 20:09
  • 1
    where did you put that in your code? is it a member of a class/struct? and what compiler is it? Commented May 17, 2011 at 20:10
  • 3
    it is in a class, a private variable Commented May 17, 2011 at 20:12
  • 2
    @hotdiggadydang: It doesn't have to be the whole program. It should be a complete, minimal testcase that exhibits the issue. See the code snippets in my answer for perfect examples of testcases. They demonstrate your issue, yet are just four/five lines long.. not hundreds. And let this be a lesson that a single line of code with no context is not sufficient! Commented May 17, 2011 at 20:18

2 Answers 2

59

You say that you did this within a class, as a private variable.

Recall that (at the moment), member variables may not be initialised in the same place where you declare them (with a few exceptions).

struct T { std::string str = "lol"; }; 

is not ok. It has to be:

struct T { std::string str; T() : str("lol") {} }; 

But, to add insult to injury, pre-C++0x you cannot initialise arrays in the ctor-initializer!:

struct T { const unsigned int array[10]; T() : array({0,1,2,3,4,5,6,7,8,9}) {} // not possible :( }; 

And, because your array's elements are const, you can't rely on assignment either:

struct T { const unsigned int array[10]; T() { for (int i = 0; i < 10; i++) array[i] = i; // not possible :( } }; 

However, as some other contributors have quite rightly pointed out, there seems little point in having a copy of the array for each instance of T if you can't modify its elements. Instead, you could use a static member.

So, the following will ultimately solve your problem in what's — probably — the best way:

struct T { static const unsigned int array[10]; }; const unsigned int T::array[10] = {0,1,2,3,4,5,6,7,8,9}; 

Hope this helps.

Sign up to request clarification or add additional context in comments.

13 Comments

Of course, you should be able to initialize the array after the class as long as you use a static member variable.
@Christopher: Technically speaking, that occurs neither "before" nor "after" the class :P
Might help to mention that the "rely on assignment" fragment cannot compile.
@Cubbi: Oops, dammit. Thanks.. I'm amazed that nobody else spotted that!
Excellent answer! Nice that you explained all the scenarios. +1 for that. : )
|
7

Since this is a private member variable in a class (according to the comment), this is indeed not allowed in C++03.

C++0x, partially supported by many modern compilers, allows the following to compile:

class C { const unsigned int ARRAY[10]; public: C() : ARRAY{0,1,2,3,4,5,6,7,8,9} {} }; int main() { C obj; // contains a non-static const member: non-assignable } 

However, non-static const members only make sense if they contain different values in different instances of the class. If every instance is to contain the same {0,1,2,3,4,5,6,7,8,9}, then you should make it static, which also makes it possible to do this in C++98:

class C { static const unsigned int ARRAY[10]; public: C() {} }; const unsigned int C::ARRAY[10] = {0,1,2,3,4,5,6,7,8,9}; int main() { C obj; } 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.