2013-06-04 12 views
7

Mam ++/C Klasa CLI tak:Błąd IntelliSense: odwołanie nie może być powiązane z polem inicjalizacyjnym?

// 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; 
    } 
} 

Projekt kompiluje bez błędów lub ostrzeżeń, jednak linia m_ptr = IntPtr::Zero zawsze podkreślone czerwonym z błędem IntelliSense: „odwołanie nie może być związana z polem initonly ". Co daje? Jak mogę się tego pozbyć?

Jest to w Visual Studio 2012 Premium Edition, ale zestaw narzędzi platformy to Visual Studio 2008 (wersja 90).

Odpowiedz

6

To błąd w analizatorze IntelliSense. Napisane przez Edison Design Group. Słynie z pisania front-endów C++, ale C++/CLI z pewnością dał im trening. Ma problemy z początkowymi polami w ogóle (IntPtr :: Zero jest initonly), czymś podobnym do here, ale niezwiązanym z tym błędem w inny sposób. Brak odpowiednika w C++ może być czynnikiem przyczyniającym się.

Nie daje to zbyt dużego testu przy użyciu takiego kodu, zadanie to jest całkowicie zbędne. CLR zapewnia już twardą gwarancję, że wszystkie pola w zarządzanej klasie są inicjowane zerowo.

Tym sposobem obejście nr 1 polega jedynie na pominięciu zadania, nie przynosi nic użytecznego.

Obejście nr 2 jest użycie standardowej C++ inicjalizacji konstruktor składnię:

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

Obejście problemu # 3, drogę na dole listy jest zainicjować go w ten sposób, unikając pole initonly:

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

Ale zdecydowanie polecam # 1.

+0

Czy pola wskaźnikowe (nie IntPtr, prawdziwe wskaźniki) również są inicjowane zerownikiem? – Asik

+1

Tak, nie są w tym względzie wyjątkowe. –

Powiązane problemy