Le compilateur de mon école ne semble pas prendre en charge C++ 11 mais je ne suis pas sûr de savoir comment contourner ce problème. Je ne suis pas sûr de ce qui cause la dernière erreur du compilateur. Je tente de compiler sous Linux avec:Comment faire pour contourner le code C++ 11 non pris en charge
gcc -std=c++0x project2.cpp
Le système ne reconnaît pas -std = C++ 11. Des idées sur la façon de le compiler? Je vous remercie!
#include <thread>
#include <cinttypes>
#include <mutex>
#include <iostream>
#include <fstream>
#include <string>
#include "time_functions.h"
using namespace std;
#define RING_BUFFER_SIZE 10
class lockled_ring_buffer_spsc
{
private:
int write = 0;
int read = 0;
int size = RING_BUFFER_SIZE;
string buffer[RING_BUFFER_SIZE];
std::mutex lock;
public:
void push(string val)
{
lock.lock();
buffer[write%size] = val;
write++;
lock.unlock();
}
string pop()
{
lock.lock();
string ret = buffer[read%size];
read++;
lock.unlock();
return ret;
}
};
int main(int argc, char** argv)
{
lockled_ring_buffer_spsc queue;
std::thread write_thread([&]() {
start_timing();
string line;
ifstream myfile("p2-in.txt");
if (myfile.is_open())
{
while (getline(myfile, line))
{
line += "\n";
queue.push(line);
cout << line << " in \n";
}
queue.push("EOF");
myfile.close();
stop_timing();
}
}
);
std::thread read_thread([&]() {
ofstream myfile;
myfile.open("p2-out.txt", std::ofstream::out | std::ofstream::trunc);
myfile.clear();
string tmp;
while (1)
{
if (myfile.is_open())
{
tmp=queue.pop();
cout << tmp << "out \n";
if (tmp._Equal("EOF"))
break;
myfile << tmp;
}
else cout << "Unable to open file";
}
stop_timing();
myfile.close();
}
);
write_thread.join();
read_thread.join();
cout << "Wall clock diffs:" << get_wall_clock_diff() << "\n";
cout << "CPU time diffs:" << get_CPU_time_diff() << "\n";
system("pause");
return 0;
}
Erreurs de compilation:
project2.cpp:14:14: sorry, unimplemented: non-static data member initializers
project2.cpp:14:14: error: ISO C++ forbids in-class initialization of non-const static member ‘write’
project2.cpp:15:13: sorry, unimplemented: non-static data member initializers
project2.cpp:15:13: error: ISO C++ forbids in-class initialization of non-const static member ‘read’
project2.cpp:16:13: sorry, unimplemented: non-static data member initializers
project2.cpp:16:13: error: ISO C++ forbids in-class initialization of non-const static member ‘size’
project2.cpp: In lambda function:
project2.cpp:79:13: error: ‘std::string’ has no member named ‘_Equal’
Sans rapport avec la question, mais évitez de verrouiller et de déverrouiller manuellement le mutex. Suivez le paradigme RAII et utilisez 'std :: unique_lock' ou' std :: lock_guard' à la place. De cette façon, vous ne pouvez pas oublier de déverrouiller votre mutex et vous êtes protégé contre les fuites de verrous en cas d'exception. –
L'erreur affichée est facile, il suffit de déplacer l'initialisation vers les constructeurs. Mais vous utilisez la bibliothèque '', qui est simplement inexistante et ne peut pas être "fixée" –
std :: string n'a pas de membre appelé _Equal dans n'importe quel standard, vous pouvez utiliser l'opérateur ==. – Eelke