2012-02-20 36 views
21

Tôi dường như không nhận được g + + để biên dịch mã C++ 11 sử dụng một hàm tạo di chuyển. Tôi cứ bị lỗi này:Làm cách nào để lấy g ++ để biên dịch mã C++ 11 với một hàm tạo di chuyển?

[email protected]:~/Projects/arraylib$ g++ ./t2.cpp 
./t2.cpp:10:27: error: expected ‘,’ or ‘...’ before ‘&&’ token 
./t2.cpp:10:38: error: invalid constructor; you probably meant ‘Blarg (const Blarg&)’ 

Chương trình Tôi viết thư này là khá khác nhau từ này, nhưng tôi cắt nó xuống để phần mà có vẻ như nó chắc chắn sẽ làm việc, nhưng vẫn gây nên các lỗi:

#include <iostream> 

using namespace std; 

class Blarg { 
    public: 
     Blarg() {}; 
     Blarg (const Blarg& original) {}; /* Copy constructor */ 
     Blarg (Blarg&& original) {}; /* Move constructor */ 
}; 

int main(int argc, char *argv[]) 
{ 
    Blarg b; 
    return 0; 
} 

Có ai cho tôi biết tôi đang làm gì sai không? Thay vào đó, làm thế nào để sửa chữa nó?

Đây là phiên bản gcc của tôi:

gcc (Ubuntu/Linaro 4.6.2-14ubuntu2) 4.6.2 
+2

Lưu ý rằng việc chuyển một tham chiếu const cho một hàm tạo di chuyển là khá vô ích; thực tế nên là 'Blarg (Blarg && original)'. – ildjarn

+0

Vâng, cảm ơn. Tôi đã sửa nó trong mã thực sự của mình. Tôi cũng sẽ sửa nó ở trên. – Collin

Trả lời

39

Say g++ -std=c++0x ./t2.cpp.

Trong khi bạn đang ở đó, bạn cũng có thể Làm Đúng ngay và cho phép tất cả các cảnh báo:

g++ -W -Wall -Wextra -pedantic -std=c++0x -o t2 t2.cpp 

Bạn thực sự, thực sự không nên biên soạn với bất kỳ ít hơn, đặc biệt là nếu bạn đang đi để đặt câu hỏi về mã của bạn trên SO :-) Các cờ tối ưu hóa khác nhau tùy ý nên được xem xét cho phiên bản phát hành, chẳng hạn như -s -O2 -flto -march=native.

+2

"Do It Right", trong khi trang man cho -std = C++ 0x nói "Tùy chọn này cho phép các tính năng thử nghiệm có thể bị xóa trong tương lai" Chúng chắc chắn là phòng thủ trong những trang đó :-) –

+0

Cảm ơn bạn rất nhiều vì đã cứu tôi từ việc lọc qua 600 trang hướng dẫn sử dụng ... Tôi sẽ chỉ kiểm tra kỹ xem công việc này theo cách tôi dự định và sau đó đánh dấu điều này là câu trả lời. – Collin

+2

@CaptainGiraffe: Để chắc chắn, tùy chọn phương ngữ không được gộp dưới "làm đúng". Điều đó nói rằng, 'C++ 0x' sẽ được hỗ trợ trong một thời gian, nhưng từ 4.7 trở đi bạn có thể nói' C++ 11', quá. –

14

Có thể bạn đã quên thêm -std=c++0x vào dòng lệnh của mình.

+0

Điều tồi tệ, cùng thời gian trả lời chỉ với câu trả lời phù hợp nhưng không nhiều phiếu bầu. Tôi nghĩ rằng bạn là một câu trả lời có liên quan ngắn gọn hơn! –

Các vấn đề liên quan