首页 > 解决方案 > std::thread 构造函数?专业化?。g++与clang++

问题描述

我需要专门化 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*&&)

你有什么想法可能是什么问题?问候,垫

标签: c++templatesg++clang++specialization

解决方案


这是不合法的。您可以根据[namespace.constraints]\2添加规范

除非明确禁止,否则程序可以将任何标准库类模板的模板特化添加到命名空间 std,前提是 (a) 添加的声明依赖于至少一个用户定义的类型,并且 (b) 特化满足标准库对原始模板。

但是,[namespace.constraints]\4继续声明

如果 C++ 程序声明了,那么它的行为是未定义的

  • 标准库类模板的任何成员函数的显式特化,

所以你不能这样做。


推荐阅读