2013-06-04 38 views
7

Tôi có một ++/CLI lớp C như thế này:Lỗi IntelliSense: một tham chiếu không thể bị ràng buộc vào trường initonly?

// MyClass.h 
#pragma once 

namespace MyNamespace { 
    using namespace System; 

    public ref class MyClass { 
    private: 
     MyClass(); 
     IntPtr m_ptr; 
    }; 
} 

// MyClass.cpp 
#include "MyClass.h" 
using namespace System; 

namespace MyNamespace { 
    MyClass::MyClass() { 
     m_ptr = IntPtr::Zero; 
    } 
} 

Dự án biên dịch mà không có lỗi hoặc cảnh báo, tuy nhiên dòng m_ptr = IntPtr::Zero luôn nhấn mạnh màu đỏ với một lỗi IntelliSense: "một tài liệu tham khảo không thể bị ràng buộc vào một lĩnh vực initonly ". Đưa cái gì? Làm thế nào tôi có thể thoát khỏi điều này?

Đây là trong Visual Studio 2012 Premium Edition nhưng Platform Toolset là Visual Studio 2008 (v90).

Trả lời

6

Vâng, đó là lỗi trong trình phân tích cú pháp IntelliSense. Được viết bởi Edison Design Group. Khá nổi tiếng với việc viết C++ front-end nhưng C++/CLI chắc chắn đã cho họ một bài tập. Nó có vấn đề với các lĩnh vực initonly nói chung (IntPtr :: Zero là initonly), một cái gì đó tương tự here nhưng không liên quan đến lỗi này. Không có bất kỳ tương đương trong C + + cũng có thể là một yếu tố góp phần.

Nó không được đặt nhiều thử nghiệm với mã như thế này, nhiệm vụ là hoàn toàn thừa. CLR đã đảm bảo rằng tất cả các trường trong một lớp được quản lý không được khởi tạo.

Vì vậy, giải pháp thay thế # 1 chỉ là bỏ qua nhiệm vụ, nó không làm bất cứ điều gì hữu ích.

Giải pháp # 2 là sử dụng các tiêu chuẩn C++ constructor khởi tạo cú pháp:

MyClass::MyClass() : m_ptr(IntPtr::Zero) {} 

Giải pháp # 3, đường ở dưới cùng của danh sách là để khởi tạo nó như thế này, tránh lĩnh vực initonly:

MyClass::MyClass() { 
    m_ptr = IntPtr(); 
} 

Nhưng tôi chắc chắn khuyên bạn nên # 1.

+0

Trường con trỏ (không phải IntPtr, con trỏ thực) cũng được khởi tạo bằng không? – Asik

+1

Có, chúng không đặc biệt trong vấn đề đó. –

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