std :: thread constructor «специализация». g ++ против clang ++ - PullRequest
0 голосов
/ 08 мая 2018

Мне нужно специализировать шаблонный конструктор std :: thread.

Следующий код хорошо компилируется с g ++, но не работает во время компиляции с clang ++ (6.0).

#include <thread>

class MyThread
{
  public:
    void start()
    {
      run();
    }

    virtual void run(void) {};
};


namespace std
{
  template<>
  thread::thread<MyThread*>(MyThread*&&)
  {
  }
}

int main(int argc, char *argv[])
{
  std::thread myThread(new MyThread);
  return 0;
}

Я получаю следующую ошибку:

  thr2.cpp:18:17: error: expected unqualified-id
  thread::thread<MyThread*>(MyThread*&&)

У вас есть идеи, в чем может быть проблема? С уважением, Мат

1 Ответ

0 голосов
/ 08 мая 2018

Это не законно. Вы можете добавить спецификации для [namespace.constraints] \ 2

Если явно не запрещено, программа может добавить специализацию шаблона для любого стандартного шаблона класса библиотеки в пространство имен std при условии, что (a) добавленное объявление зависит по крайней мере от одного определенного пользователем типа и (b) специализация соответствует стандартной библиотеке Требования к оригинальному шаблону.

Но, [namespace.constraints] \ 4 продолжает утверждать, что

Поведение программы на C ++ не определено, если она объявляет

  • явная специализация любой функции-члена стандартного шаблона библиотечного класса,

Так что вы не можете сделать это.

...