Fred Finkle
Fred Finkle

Reputation: 2017

Using clang 3.1 with initializer lists

When I compile this code:

template<typename T>
struct S {
  std::vector<T> v;
  S(initializer_list<T> l) : v(l) {
    std::cout << "constructed with a " << l.size() << "-element list\n";
  }
};

using the following command line:

 clang++ -std=c++11 -stdlib=libc++ initializer_list.cpp

I get the following error.

initializer_list.cpp:12:23: error: expected ')'
    S(initializer_list<T> l) : v(l) {

Does anyone know the fix if any??

Thanks in advance

Upvotes: 2

Views: 1418

Answers (2)

Richard Smith
Richard Smith

Reputation: 14158

Your code sample is incomplete. It would be useful if you can provide a complete example. The problem with the code as written is that you're missing

#include <initializer_list>
#include <vector>
#include <iostream>

... and initializer_list is in namespace std, so you're also missing a std:: from your constructor declaration.

However, since you've claimed that neither of these is the issue, the most likely cause would seem to be that your C++ standard library implementation doesn't provide std::initializer_list. That would be the case if Clang is using GCC's libstdc++, and you do not have a suitably new version of that installed: you need at least version 4.4, but note that a patch is required to fix bugs in libstdc++-4.4 in order to make it work with Clang in C++11 mode, otherwise you will get errors about type_info and various other problems.

Also, you say that the diagnostic you received is this:

initializer_list.cpp:12:23: error: expected ')'
    S(initializer_list<T> l) : v(l) {
                      ^

(I've reconstructed the caret from the provided column number; it would be useful to preserve it in future questions.) For any of the above explanations, this will not be the first diagnostic which Clang produces; that would be something along the lines of:

initializer_list.cpp:12:5: error: no template named 'initializer_list'; did you mean 'std::initializer_list'?
  S(initializer_list<T> l) : v(l) {
    ^~~~~~~~~~~~~~~~
    std::initializer_list

So either you've missed out the first diagnostic from your question, or the problem is that you have declared some other (non-template) type named initializer_list in the code you omitted in your question, and that is hiding std::initializer_list. Without seeing the rest of your code or the rest of your diagnostics, it's not possible to tell which.

Upvotes: 2

ecatmur
ecatmur

Reputation: 157364

You probably meant to write std::initializer_list<T>. Make sure you include <initializer_list>.

Upvotes: 3

Related Questions