Конструктор std :: unordered_map с initializer_list и размером компилируется в main, но не в определении класса - PullRequest
4 голосов
/ 27 октября 2019

Я пытаюсь инициализировать std::unordered_map, используя конструктор, который принимает данные через список инициализации и начальное количество сегментов.

По какой-то причине этот конструктор работает, если я помещаю его в main, но имеет синтаксическую ошибку, когда я помещаю его в заголовок класса.

В частности, заголовок, называемый momo.h:

#pragma once
#include <unordered_map>

namespace std 
{
   template <>
   struct hash<std::pair<uint16_t, uint16_t>>
   {
      std::size_t operator()(const std::pair<uint16_t, uint16_t>& k) const
      {
         return (std::hash<long>()((((long)k.first) << 16) + (long)k.second));
      }
   };
}

class test
{
   std::unordered_map<std::pair<uint16_t, uint16_t>, uint16_t> m_Z(
      { /* Fails here: syntax error: missing ')' before '{' */
          {std::pair{ 1, 2 }, 3},
          {std::pair{ 4, 5 }, 6}
      }, 128);

};

Пока я удаляю определение из заголовка в main, таким образом:

#include "Momo.h"

int main()
{
   test X;

   std::unordered_map<std::pair<uint16_t, uint16_t>, uint16_t> Y(
      {
          {std::pair{ 1, 2 }, 3},
          {std::pair{ 4, 5 }, 6}
      }, 128);
}

Код компилируется без ошибок. Почему?

1 Ответ

8 голосов
/ 27 октября 2019

Вам необходимо braced-init-list (или единообразное инициирование) std::unordered_map в классе.

class test
{
   std::unordered_map<std::pair<uint16_t, uint16_t>, uint16_t> m_Z{ // >> brased init
      { 
           {std::pair{ 1, 2 }, 3},
           {std::pair{ 4, 5 }, 6}
      }, 128 
   }; // >>>

};
...