Почему я не могу скомпилировать этот простой тест потока? - PullRequest
2 голосов
/ 15 июня 2019

Я хотел протестировать некоторые вещи с потоками на моем MacBook Pro, но не могу заставить его работать.

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

это версия clang, установленная на моей машине. Я попытался закодировать некоторый вектор потоков, но это не сработало, поэтому я вернулся и скопировал пример из SO.

#include <string>
#include <iostream>
#include <thread>

using namespace std;

// The function we want to execute on the new thread.
void task1(string msg)
{
    cout << "task1 says: " << msg;
}

int main()
{
    // Constructs the new thread and runs it. Does not block execution.
    thread t1(task1, "Hello");

    // Do other things...

    // Makes the main thread wait for the new thread to finish execution, therefore blocks its own execution.
    t1.join();
}

Но я получаю ошибку компилятора ..

error: no matching constructor for initialization of
      'std::__1::thread'
    thread t1(task1, "Hello");

Полагаю, проблема в моей машине, но почему?

1 Ответ

5 голосов
/ 15 июня 2019

Каким-то образом вы создали свой код как C ++ 03, возможно, не указав стандартный флаг ревизии в явном виде.libc ++, реализация стандартной библиотеки LLVM позволяет использовать <thread> в коде C ++ 03.Исходный код имеет условную компиляцию следующего вида :

#ifndef _LIBCPP_CXX03_LANG
    template <class _Fp, class ..._Args,
              class = typename enable_if
              <
                   !is_same<typename __uncvref<_Fp>::type, thread>::value
              >::type
             >
        _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
        explicit thread(_Fp&& __f, _Args&&... __args);
#else  // _LIBCPP_CXX03_LANG
    template <class _Fp>
    _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
    explicit thread(_Fp __f);
#endif

В C ++ 11 и более поздних версиях конструктор соответствует стандарту C ++ 11.В противном случае он принимает только вызываемый без дополнительных аргументов.Мне удалось воспроизвести вашу ошибку с помощью стандартного флага ревизии C ++ 03.Ошибка даже упоминает этот кандидат:

prog.cc:16:12: error: no matching constructor for initialization of 'std::__1::thread'
    thread t1(task1, "Hello");
           ^  ~~~~~~~~~~~~~~
/opt/wandbox/clang-8.0.0/include/c++/v1/thread:408:9: note: candidate constructor template not viable: requires single argument '__f', but 2 arguments were provided
thread::thread(_Fp __f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...