2011-01-10 18 views
12

bir nesne atamak, ancak derleyici hata ile bunu başaramadı olamaz. Program nasıl değiştirilir? Çalışmasını sağlamak için, neden doğrudan yapamıyorum?Ben aynı tip uçucu nesneye bir nesne atamak istediğiniz bir uçucu nesneye

Burada derleyici olarak Visual Studio 2010 kullanıldı.

class A 
{ 
public: 
}; 

int _tmain() 
{ 
    A a; 
    volatile A va; 
    va = a;  // compiler error:C2678 here 
    return 0; 
} 
+2

'const' ve 'volatile' madalyonun iki yüzü vardır; Standartla ilgili olarak, genellikle "cv-qualifiers" olarak adlandırdıkları ile çok ilgilidirler. http://stackoverflow.com/questions/4479597/does-making-a-struct-volatile-make-all-its-members-volatile/4479652 – Nawaz

cevap

18

Sen volatile nitelikcisiyle A için bir atama operatörü fonksiyonunu tanımlamak gerekir.

class A 
{ 
    public: 

    volatile A& operator = (const A& a) volatile 
    { 
     // assignment implementation 
    } 
}; 

Bir sınıfa bir atama operatörü tanımlamak yoksa, C++ A& operator = (const A&); varsayılan atama operatörü yaratacaktır. Ancak, volatile niteleyicisiyle bir varsayılan görevlendirme operatörü oluşturmayacak, dolayısıyla bunu açıkça tanımlamanız gerekir.

+1

Teşekkür: şuna bakın. Dönüş türünün uçucu A & ' – Thomson

+0

@ Tommson olması gerektiğini düşünüyorum: Evet. Haklısın. – Nawaz

+0

Bir platform başlık dosyasından geldiğinden 'struct' türünü denetlemezseniz bu sorunu nasıl temizlersiniz? – Kaz

-1

Ben aynı soruyu encounted var. Örneğin:

struct A { int i; } 
volatile A a; 
A b; 
a = b; // C2678 here. 

Bunu çözmek için, bu yöntem bulundu:

const_cast<A &>(a) = b; 
+0

Uçucuları yok edemezsiniz, kodunuzun tanımlanmamış davranışları vardır. –

+0

@JamesJohnston Yapı tanımını kontrol etmediğiniz durumlar için daha temiz bir çözümünüz var mı? (Bir sistem API üstbilgisinden geldiğinde olduğu gibi) Bu çözüm ile gittim. Davranışın undefined olduğuna inanmıyorum çünkü bu “const” niteleyicisi değil. Bir nesneye atamanın "uçucu" olup olmadığına ve "uçucu" özel bir erişim türü olup olmamasına izin verilir; niteleyici, yalnızca optimizasyonu etkiler (iki veya daha fazla erişimin bire birleştirilmiş olup olmadığı). Bu benim durumumda önemli değil; Bu muhtemelen bir problem olamaz. – Kaz

+0

Üzgünüm ama yanılıyorsunuz ve davranış tanımsız. http://stackoverflow.com/a/7368038/562766 Bkz - C11 dan: "girişimi uçucu olmayan nitelikli tip bir lvalue kullanımı ile bir uçucu madde nitelikli tip tanımlanan bir nesneye atıfta yapılır (6.7 .3) "--- Yukarıdaki örnekte, uçucu, başlangıçta uçucu ile tanımlanan" a "dan uzaklaştırılır ve sonra atanır. Kodunuzun doğruluğu şimdi optimize edicinin merhametindedir. –