2013-06-04 16 views
7

私はこのようなC++/CLIクラスを持っている:IntelliSenseエラー:参照を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; 
    } 
} 

プロジェクトは、しかしラインm_ptr = IntPtr::ZeroはいつものIntelliSenseエラーで赤い下線が引かれ、エラーや警告なしでコンパイル:「参照がinitonlyフィールドにバインドすることはできません"何がありますか?どうすればこれを取り除くことができますか?

これはVisual Studio 2012 Premium Editionに含まれていますが、Platform ToolsetはVisual Studio 2008(v90)です。

答えて

6

これは、IntelliSenseパーサーのバグです。エジソンデザイングループによって書かれています。かなり有名なC++フロントエンドだが、C++/CLIは確かに彼らにトレーニングを与えている。 initonlyフィールド(IntPtr :: Zeroはinitonly)に問題があります。これはhereと似ていますが、このバグには関係ありません。 C++で同等のものを持っていないことも、それが寄与する要素かもしれません。

このようなコードでテストを行うことはあまりありません。割り当ては完全に余計です。 CLRは既に、マネージクラスのすべてのフィールドがゼロで初期化されることを強く保証します。

回避策#1は割り当てを省略するだけですが、何も役に立ちません。

:リストの一番下に道が initonlyフィールドを避け、このようにそれを初期化することで、

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

回避策#3:

回避策#2は、標準C++のコンストラクタの初期化構文を使用することです

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

しかし、私は確かに#1をお勧めします。

+0

ポインタフィールド(IntPtr、実ポインタではない)もゼロで初期化されていますか? – Asik

+1

はい、それはその点で特別ではありません。 –

関連する問題