2011-11-18 41 views
10

Code:Tại sao tôi gặp lỗi "error: unknown type name 'virtual'" khi cố gắng biên dịch mã này?

struct IRenderingEngine { 
    virtual void Initialize(int width, int height) = 0; 
    virtual void Render() const = 0; 
    virtual void UpdateAnimation(float timeStep) = 0; 
    virtual void OnRotate(DeviceOrientation newOrientation) = 0; 
    virtual ~IRenderingEngine() {} 
}; 

OpenGLES Rút kinh nghiệm từ một cuốn sách cho lập trình iphone 3d và nó sử dụng mã ví dụ này, nhưng cuốn sách được nhắm mục tiêu cho xcode 3.x

Bằng cách nào đó tôi cảm thấy như một cái gì đó với xcode 4. ...

EDIT:

Heres lỗi thực tế:

/Users/Dan/Documents/OpenGLES/Hell o Mũi tên/Xin chào mũi tên/IRenderingEngine.hpp: 27: 2: lỗi: tên không xác định 'ảo' [1]

Và hợp pháp là tất cả những gì cần để biên dịch, hoàn toàn không có tệp nào khác. (Có, tôi đã cố gắng biên dịch theo nghĩa đen là tệp main.m và tệp hpp này)

Mặc dù vậy, nếu tôi cố gắng thêm tệp đó vào tệp được biên dịch, nó sẽ nói "không quy tắc để xử lý tệp '$ (PROJECT_DIR)/Xin chào mũi tên/IRenderingEngine.hpp' của kiểu sourcecode.cpp.h cho kiến ​​trúc i386 "vì vậy tôi thực sự không biết điều gì đang xảy ra

Lưu ý rằng tôi đã biên dịch bằng main.m nghĩa là tôi đã biên soạn một ứng dụng dựa trên Cocoa/Foundation khác

Tôi đã cố gắng biên dịch cho ứng dụng C++ và mọi thứ hoạt động tốt ... Tương tự việc biên dịch với tệp kiểm tra main.mm cũng hoạt động tốt

heres dự án thực tế, lemme biết làm thế nào điên Tôi thực sự:

[Removed xem xét tôi bị mất các tập tin]

+2

Đăng SSCCE. Tôi không thể giúp bạn với mã này, nó rõ ràng không phải là nguồn thực sự của vấn đề. – Puppy

+0

http://pastie.org/private/07cebz0irqp6ehybicctw nghĩa là toàn bộ tệp và nó sẽ không biên dịch. chỉ ném lỗi: tên loại không xác định 'ảo' [1] – DanZimm

+0

Ý của bạn là 'main.m' là gì? C++ không sử dụng các tệp '.m'. Sử dụng '.cpp' – Adam

Trả lời

22

Vui lòng đổi tên main.m thành main.mm. Điều này làm việc cho tôi.

+5

Tôi phải đổi tên cả main.m và AppDelegate.m bằng phần mở rộng .mm. – jessecurry

+0

Để có được ví dụ này làm việc trong xcode 4 tôi cũng đã có để có được xóa các tập tin MainStoryboard_iPhone.storyboard và MainStoryboard_iPad.storyboard cũng như loại bỏ tài liệu tham khảo của họ từ HelloArrow-Info.plist, nhưng các lỗi cho những người đã được rõ ràng hơn nhiều. – Lockyer

0

Đây chỉ là một phỏng đoán ngu ngốc vì tôi chưa bao giờ cố gắng biên soạn một cái gì đó với chữ ảo trong một trình biên dịch C ... nhưng có bất kỳ cơ hội mà bạn đã cố gắng để biên dịch mã C + + này là mã C? Đó là lý do duy nhất tôi có thể nghĩ rằng một trình biên dịch sẽ không hiểu từ khóa ảo.

+0

được cho là xcode đang biên dịch các tệp dựa trên các loại tệp của chúng (vì điều này xảy ra là hpp vì vậy tôi đoán nó đủ thông minh để biết điều đó có nghĩa là cpp) – DanZimm

0

Tiêu đề <stdlib.h> không phải là quyền phù hợp để sử dụng trong chương trình C++. Khi tôi thay thế nó bằng phiên bản C++ của thư viện stdio của C <cstdlib> thì mã của bạn được biên dịch cho tôi.

+0

khi tôi thử thêm nó vào tiêu đề mà lỗi có thể Không tìm thấy tập tin đó – DanZimm

+0

Tôi đã chỉnh sửa câu trả lời với tên thư viện phù hợp. Thử ngay bây giờ. –

+0

cùng một vấn đề như trước – DanZimm

2

Nếu bạn đang sử dụng Xcode 4, hãy thử đổi tên tệp "AppDelegate.m" thành "AppDelegate.mm". Nó làm việc cho tôi.

2

Thay đổi tên tệp "AppDelegate.m" thành "AppDelegate.mm". Đúng!

2

Tôi đã di chuyển dòng #import "IRenderingEngine.hpp" từ tệp GLView.h sang GLView.mm - điều này ngăn không cho nó được nhập vào tệp main.m và HelloArrowAppDelegate.m khi chúng được biên dịch - và hạn chế nhập vào tệp .mm, có thể xử lý C++.

Tôi cũng phải thực hiện một số bản sửa lỗi khác mà tôi đã giới thiệu khi nhập mã - vì vậy xin lỗi nếu đó không phải là điều duy nhất cần thực hiện, nhưng nó có thể giúp những người có vấn đề tương tự !

+0

Điều này làm việc cho tôi! Giải pháp rất đơn giản, chỉ cần di chuyển tất cả các biến mẫu của bạn vào @implementation. – John

1

nếu bạn gọi các tệp C++ (ngay cả khi bạn chỉ nhập chúng), bạn cần thay đổi tệp .m mà cuộc gọi của nó thành .mm

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