17 Aralık 2018 Pazartesi

Most Vexing Parse

Giriş
Most Vexing Parse "en sinir bozucu parse" olarak çevirilebilir. Vexation ile ilgili.Bir satırın değişken tanımlaması mı yoksa fonksiyon tanımlaması mı olduğunun ayırt edilememesi anlamına geliyor.

Düzeltmek İçin
Şöyle yaparız. Constructor için süslü parantez veya geçici bir değişken kullanmak yeterli.
You can disambiguate this from a declaration by either using Boo{num}; instead of Boo(num); (because {} around the declarator is not allowed.), by making the temporary a named variable, e.g. Boo temp(num);, or by putting it as an operand in another expression, e.g. (Boo(num));, (void)Boo(num);, etc.

Hata mesajı
Visual Studio'da şuna benzer
warning C4930: '...': prototyped function not called (was a variable definition intended?)
Clang şuna benzer.
warning: parentheses were disambiguated as redundant parentheses around declaration of
variable named 'num' [-Wvexing-parse]
Boo(num); // No default constructor 
Default Constructor Zannedilmesi
Örnek
Şöyle yapmamalıyız. Default constructor'ın çağrıldığı düşünülüyor ancak aslında Circle nesnesi dönen c2 metodu tanımlanıyor.
Circle c2();
Örnek
Şöyle yapmamalıyız.
// does not compile
Foo (value_1);
Constructor'a Parametre Geçildiğinin Zannedilmesi
Örnek
Şöyle yapmamalıyız. Constructor'a parametre geçdildiği düşünülüyor ancak aslında Box parametresi alan ve Box nesnesi dönen a metodu tanımlanıyor.
Box a(Box())
Düzeltmek için şöyle yaparız.
Box a{Box{}}
Örnek
Şöyle yaparız.
#include <memory>

class Foo
{
public:
  Foo() {};
};

class Bar
{
public:
  Bar( const std::shared_ptr<Foo>& foo ) {}
}; 

int main()
{
  Foo* foo = new Foo;
  Bar bar( std::shared_ptr<Foo> {foo} ); //Derleme hatası almamak için
  return 0;
}
Üye Alan Tanımlandığının Zannedilmesi
Örnek
Elimizde şöyle bir kod olsun. a tipinden Test isimli nesne tanımlandığı zannediliyor ancak aslında Test isimli metod tanımlanıyor.
#include <iostream>
using namespace std ;

class A
{
  public:
    A(int xinit, int yinit){x=xinit; y=yinit;}

  private:
    int x, y;
};

class B
{
  public:
    b(int pinit, int qinit){p=pinit; q=qinit;}

  private:
    int p,q;
    a Test(p,q); //Most verxing parse hatası
};

Hiç yorum yok:

Yorum Gönder