2017-02-02 18 views
0

Я уже нашел несколько тем на этом форуме, обсуждая о недопустимой копии объектов потока, но я не уверен (по крайней мере, я не думаю, что так) это мое дело.Определение потока как переменной частного класса, похоже, работает под Linux, но не под Windows Visual Studio

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

class of_driving{ 
public: 
    of_driving(); 
    ~of_driving(); 

    // ... Some public stuff ... 

private: 
    // ... Some private stuff ... 
    std::ofstream J_f; 
}; 

, и это сработало легко. Теперь я пытаюсь сделать в принципе то же самое для другого приложения, но я работаю на Visual Studio под Windows:

class FTSensor{ 

public: 
    FTSensor(); 
    ~FTSensor(); 
private: 
    std::stringstream ftMeasurementSS; 
}; 

Однако, когда я построить решение, я получил следующее сообщение об ошибке:

Errore 2 error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>' D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\sstream 724

Может ли кто-нибудь объяснить мне такое поведение? Я подчеркнул, что я работал над разными ОС только потому, что для меня это единственное различие, но я также ожидаю, что причина может быть разного характера. Заранее спасибо

+0

Какую версию MSVS вы используете? – NathanOliver

+0

Разница в ОС не имеет значения. Важно то, что в вашем случае компилятор для Windows VC++, а под Ubuntu gcc я бы сказал, хотя вы не укажете. На одной платформе всегда есть несколько компиляторов, поэтому перечисление платформы не очень помогает. – Rakete1111

+2

Похоже, вы пытаетесь скопировать поток. Предоставьте ** полный, воспроизводимый пример **, минимальный. –

ответ

0

Как отметил @ Cheersandhth.-Alf и @PaulMcKenzie, причина ошибки заключается в механизме копирования. На самом деле, в моем main.cpp я написал

int main(){ 

FTSensor fts; 
tg.create_thread(boost::bind(&FTSensor::threadCallback,fts)); 
tg.join_all(); 

} 

где экземпляр fts всего класса FTSensor передается по значению в методе boost::bind, возникающие ошибки выше. Исправление линии в

tg.create_thread(boost::bind(&FTSensor::threadCallback,&fts)); 

Результаты успешной сборки. Благодарим вас за вашу быструю поддержку.

 Смежные вопросы

  • Нет связанных вопросов^_^