Hata

2013-05-20 9 views
32

ben varsa, kullanıcı tanımlı olduğu gibi operator+(): beklendiği gibi Ardından aşağıdaki işlerHata

class A 
    { 
    public: 
     A operator+(A) 
     { 
      return A(); 
     } 
    }; 

:

A a = A() + A(); 

ama g ++ - 4.7, aşağıdaki hata iletisini verir:

A a = (A()) + A(); 

Özellikle hata iletisidir error: no match for ‘operator+’ in ‘+A()’.
İfadede (A()) göz ardı ediliyor gibi görünüyor.

Sorum şu ki: A a = (A()) + A(); derlenmeli ve değilse, neden olmasın?

Not: Bu, #define X (Identity()) yaptığımda ve daha sonra X + X'u denediğimde bana oldu.

+0

İlginç. Bilmediyseniz, tek başına artı operatörü, ör. +5 olarak ele alınır. – chris

+0

@chris Şimdi bahsettiğinize göre, bu bölümü bölüm operatörüne değiştirdiğinizde hata oluşmaz, ancak toplama, çıkarma ve çarpma operatörleri için geçerlidir. Bu durumda ikili olmayanlar yerine tekli operatörleri ayrıştırma gibi görünüyor. – SirGuy

cevap

46

Bu bir yazım sözdizimi. Bunun nedeni, döküm ve tekli toplama, çıkarma ve çarpma işleminin (dereference operatörü) ikili benzerlerinden daha yüksek önceliğe sahip olmasıdır.

A a = (A()) +A(); 

döküm ve unary+ ikili operator+ böylece ifade eski anlamını alır daha yüksek önceliğe sahiptir: beyaz boşluklar burada bu önemli olmadığından olarak da okunabilir.

İçindeki şey tür olmadığında nasıl yazabileceğinizi merak ediyor olabilirsiniz. THE MOST VEXING PARSE! girin, bu da 0 argümanını alıp A türünde bir nesneyi döndüren bir işleve +A() türünde bir nesne yazmaya çalışıyorum. Kayıt için

, sözdizimi:

A a = ((A())) + A(); 

çift parantez bir döküm olamaz ve geri ikili operator+ ifadesini ayrıştırma için olduğun istediğini verir.

Ayrıca bu, sorunun neden yerine bölüm operatörüyle birlikte gerçekleşmediğini de açıklar, tek bir karşılığı yoktur.

+8

Bu, daha çok oyu hak ediyor. – chris