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.
Hata mesajı
Visual Studio'da şuna benzer
Ö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.
Şöyle yapmamalıyız.
Ö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.
Şöyle yaparız.
Örnek
Elimizde şöyle bir kod olsun. a tipinden Test isimli nesne tanımlandığı zannediliyor ancak aslında Test isimli metod tanımlanıyor.
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