ошибка: нет типа с именем ‘type’ в ‘class std::result_of

#c #multithreading

#c #многопоточность

Вопрос:

Я знаю, что этот тип вопроса уже задавался, но я не могу понять причину ошибок, которые я получаю..

Я пытаюсь протестировать реализацию блокировки, как указано ниже, используя несколько потоков:

 class TTAS
{
    atomic<bool> state;
public:
    TTAS(){
        state =  ATOMIC_FLAG_INIT;
    }
    void lock() {
        while(true) {
            while(state) {};
            // using exchange() which is equivalent to getAndSet but with lookup
            if (!state.exchange(true)) {
                return;
            }
        }
    }
    void unlock() {
        state.exchange(false);
    }
};
  

Я создаю потоки для этого, используя приведенный ниже код:

 void test2(TTAS t) {

}
TTAS t();

for (int i = 0; i < 10; i  ) {

    // Create a thread and push it into the thread list and call the distributedWrite function
    threadList.push_back(std::thread(test2, std::ref(t)));
}
  

Когда я компилирую этот код, я получаю приведенную ниже ошибку. Я не знаю, что я здесь делаю не так..

 In file included from /usr/include/c  /5/thread:39:0,
                 from assgn4.cpp:17:
/usr/include/c  /5/functional: In instantiation of ‘struct std::_Bind_simple<void (*(std::reference_wrapper<TTAS()>))(TTAS)>’:
/usr/include/c  /5/thread:137:59:   required from ‘std::thread::thread(_Callableamp;amp;, _Argsamp;amp; ...) [with _Callable = void (amp;)(TTAS); _Args = {std::reference_wrapper<TTAS()>}]’
assgn4.cpp:186:60:   required from here
/usr/include/c  /5/functional:1505:61: error: no type named ‘type’ in ‘class std::result_of<void (*(std::reference_wrapper<TTAS()>))(TTAS)>’
       typedef typename result_of<_Callable(_Args...)>::type result_type;
                                                             ^
/usr/include/c  /5/functional:1526:9: error: no type named ‘type’ in ‘class std::result_of<void (*(std::reference_wrapper<TTAS()>))(TTAS)>’
         _M_invoke(_Index_tuple<_Indices...>)
         ^
  

Не мог бы кто-нибудь, пожалуйста, объяснить эту ошибку. Заранее спасибо

Ответ №1:

Кажется, вы столкнулись с самым неприятным синтаксическим анализом

 TTAS t();
  

t это функция, не принимающая аргументов и возвращающая TTAS .

Предпочитаю единообразный синтаксис инициализации1 вместо устаревшего:

 TTAS t{}; // no ambiguity here
  

Есть еще одна проблема с вашим кодом, который test2 принимает свой аргумент по значению, но TTAS содержит std::atomic<bool> который не является ни копируемым, ни перемещаемым.

1
хотя это несколько неправильное название, поскольку оно не совсем единообразно

Комментарии:

1. Спасибо за быстрый ответ.. Я изменил atomic<bool> на atomic<bool>* , что устранило проблему..

2. @anirudh моим первым шагом было бы заставить test2 принять ссылку, но я не знаю вашего варианта использования, поэтому ваше решение может быть совершенно верным и лучшим.

Ответ №2:

TTAS t(); это объявление функции. объявите его как TTAS t; , если вам нужна переменная, созданная по умолчанию.