Почему нельзя инициализировать мой класс из списка инициализаторов, даже если он происходит от std :: list?

У меня есть следующий код.

#include <utility>
#include <list>
#include <iostream>

class Pair: public std::pair<unsigned int, unsigned int>{
Pair (unsigned int h, unsigned int l) : pair(h,l){};
};
class PairList: public std::list<Pair>{};int main(int argc, char** argv){

PairList pl = {{800,400},{800,400}};
}

Я скомпилировал его, используя MinGW g ++ из v4.6 с командной строкой
g++ -std=c++0x Test.cpp -o test.exe
и получил ошибку:
error: could not convert '{{800, 400}, {800, 400}}' from '<brace-enclosed initializer list>' to 'PairList'
Но если в main () я напишу
list<pair<unsigned int,unsigned int>> pl = {{800,400},{800,400}};
все работает отлично.
WTF?

1

Решение

Есть два способа:

  1. Не наследуйте от стандартных классов, используйте typedef вместо:

    typedef std::pair<unsigned int, unsigned int> Pair;
    typedef std::list<Pair> PairList;
    
  2. Реализуйте правильные конструкторы в ваших унаследованных классах (принимая std::initializer_list в качестве аргумента), конструкторы базового класса не могут использоваться автоматически.

Я рекомендую первый вариант, так как стандартные классы (за редким исключением) не предназначен для наследования.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]