【问题标题】:invalid use of void expression - C++无效使用无效表达式 - C++
【发布时间】:2015-10-09 15:20:30
【问题描述】:

问题是由于这个错误我无法编译:

ejercicio_4.cpp: In function ‘int main()’: *
ejercicio_4.cpp:32:49: error: cannot call member function ‘void Calculos::calcular_desvtipica(double)’ without object
  P[2] = thread(Calculos::calcular_desvtipica(5.0), p3);

这里是 Calculos.h

#ifndef CALCULOS_H
#define CALCULOS_H
#include <iostream>
#include <string>
#include <chrono>
#define N 100
using namespace std;

class Calculos {
public:
    Calculos(double T[], int op);  
    Calculos(); 
    void run();
    void calcular_desvtipica(double media);

    double *T;
    int op;
    double max, min, desvtipica, media;
};
#endif

Calculos.cpp

#include <iostream>
#include <string>
#include <chrono>
#include "Calculos.h"
using namespace std;

Calculos::Calculos(double T[], int op) { 
    this->T = T;
    this->op = op;
};

Calculos::Calculos() { }

void Calculos::run() {
    if(op == 1) {   //calcular media
        double suma = 0.0;
        for(int i = 0; i < N; i++) {
            suma = suma + T[i];
        }
        media = (double)(suma/N);
    }
    else if(op == 2) {  //calcular maximo y minimo
        double datoMax = T[0], datoMin = T[0];
        for(int i = 1; i < N; i++) {
            if(T[i] > max) max = T[i];
            if(T[i] < min) min = T[i];
        }
        max = datoMax;
        min = datoMin;
    }
    else {  //op=3 calcular desviacion tipica
        cout << "que cojones hago aqui" << endl;
    }
};

void Calculos::calcular_desvtipica(double media) {
    desvtipica = media/2.0;
};

这里是主要方法

#include <iostream>
#include <thread>
#include <string>
#include <chrono>
#include "Calculos.h"
using namespace std;

int main() {
    double T[N];
    for(int i = 0 ; i < N; i++) {
        T[i] = (double)rand();
    }

    thread P[3];

    Calculos p1(T, 1),
             p2(T, 2),
             p3(T, 3);
    P[0] = thread(&Calculos::run, p1);
    P[1] = thread(&Calculos::run, p2),
    P[0].join();
    double m = p1.media;
    P[2] = thread(Calculos::calcular_desvtipica(m), p3);
    P[1].join();
    P[2].join();

    cout << "#datos: " << N << endl;
    cout << "media: " << p1.media << endl;
    cout << "min: " << p2.min << endl;
    cout << "max: " << p2.max << endl;
    cout << "sigma: " << p3.desvtipica << endl;

    cout << "Fin\n";
    return 0;
}

我尝试改变这一行:

P[2] = thread(Calculos::calcular_desvtipica(m), p3);

到:

P[2] = thread(p3.calcular_desvtipica(m), p3);

但它不起作用。问题出在哪里?

【问题讨论】:

  • 我的第一个猜测是你想要P[2] = thread(&amp;Calculos::calcular_desvtipica, std::ref(p3), m);
  • 你说P[2] = thread(p3.calcular_desvtipica(m), p3);“不起作用”。怎么不行?

标签: c++ c++11 compiler-errors system-calls


【解决方案1】:

P[2] = thread(Calculos::calcular_desvtipica(m), p3); 行替换为 P[2] = thread(&amp;Calculos::calcular_desvtipica, std::ref(p3), m);

顺便说一句,ref() 也应该在其他 std::thread 构造函数中使用,因为您可能不想复制您的 Calculos 对象。

【讨论】:

    【解决方案2】:
    thread(Calculos::calcular_desvtipica(m), p3);
    

    线程在这里需要Function。您正在调用 calcular_...,返回 void。那不是一个功能。此外,您正在静态调用非静态方法,这是不可能的(这种方式)。

    thread(p3.calcular_desvtipica(m), p3);
    

    基本上相同的故事,只是这次你调用 calcular_.... 为 real 并返回 void。

    thread(&Calculos::calcular_..., std::ref(p3), m);
    

    在这种情况下,我们给线程一个函数指针,以及它需要的参数(包括对象指针)。 std::ref 在这种情况下避免了可能不需要的副本。

    【讨论】:

    • P[2] = thread(&Calculos::calcular_desvtipica, std::ref(p3), m);返回错误。如果我把 P[2] = thread(&Calculos::calcular_desvtipica, p3, m);正确编译
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多