2015-10-09 29 views
0

的問題是,我不能編譯由於此錯誤:無效使用空隙表達的 - C++

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); 

,但它不工作。哪裏有問題?

+1

我的第一個猜測是你想'P [2] = thread(&Calculos :: calcular_desvtipica,std :: ref(p3),m);' –

+0

你說'P [2] = thread(p3.calcular_desvtipica m),p3);'「不起作用」。它怎麼不起作用? –

回答

3

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

替換行P[2] = thread(Calculos::calcular_desvtipica(m), p3);順便說一句,REF()也許應該在其他的std ::線程構造方法爲好,因爲你可能不想複製你的Calculos對象。

2
thread(Calculos::calcular_desvtipica(m), p3); 

此處的線程預計爲Function。你正在調用calcular _...,返回void。這不是一個功能。此外,您正靜態調用非靜態方法,這是不可能的(這種方式)。

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

基本上相同的故事,但這個時候你撥打電話進行實時calcular _....並返回void。

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

在這種情況下,我們給線程一個函數指針和它需要的參數(包括對象指針)。在這種情況下,std :: ref避免了可能不想要的副本。

+0

P [2] =線程(&Calculos :: calcular_desvtipica,std :: ref(p3),m);返回一個錯誤。如果我把P [2] =線程(&Calculos :: calcular_desvtipica,p3,m);編譯正確 –