2011-06-22 20 views
5

boost :: isteğe bağlı <> basit veri türleri için mükemmel çalışır ancak bir arabirimi uygulayan bir sınıftan miras alınan bir sınıf için kullanılır kullanılmaz katı takma etkinleştirildiğinde başarısız olur.Neden boost :: isteğe bağlı sanal işlevler devralma sınıfları için başarısız

Örnek:

#include <boost/optional.hpp> 

struct MyLine{ 
    double a; 
    double b; 
}; 

class Edge{ 
    public: 
    MyLine toMyLine() const; 
    private: 
    virtual MyLine doToMyLine() const =0; 
}; 

class Wall:public Edge { 
    public: 
    Wall(MyLine const& seg):mMyLine(seg){}; 
    private: 
    MyLine doToMyLine() const{return MyLine();}; 
    MyLine mMyLine; 
}; 

class SimpleWall { 
    public: 
    SimpleWall(MyLine const& seg):mMyLine(seg){}; 
    private: 
    MyLine mMyLine; 
}; 

int main(){ 
//boost::optional<Wall> res;  //fails with strict aliasing error 
boost::optional<SimpleWall> res2; //compiles just fine 
} 

hata şudur aşağıdaki kullanarak gcc sürümü 4.4.3 ile Derleyen:

bu sorunu çözmek için en iyi yol nedir
g++ -c -pipe -Wall -Wextra -Wunused -Wmissing-declarations -Wpointer-arith -Wcast-align -Wwrite-strings -Wredundant-decls -Werror -std=c++0x -O2 -Wall -W -I/usr/local/boost_1_44_0 -o obj/main.o main.cpp 

. Ben sıkı takma uyarı etkin bırakmak istiyorum çok istiyorum.Yükleme 1.44 sürümünü kullanıyorum.

GÜNCELLEME:

Giderek kötüleşiyor !! Ben,

g++ -c -pipe -Wall -Wextra -Wunused -Wmissing-declarations -Wpointer-arith -Wcast-align -Wwrite-strings -Wredundant-decls -Werror -std=c++0x -O2 -Wall -W -I/usr/local/boost_1_44_0 -o obj/main.o main.cpp 

satırları "// sürpriz açıklama" ile işaretlenmiş ise dışarı yorumladı gibidir:

#include <boost/optional.hpp> 

class MyBase{ 
    public: 
    int toFoo() const; 
    private: 
    virtual int doToFoo() const =0; 
}; 

class Child:public MyBase { 
    public: 
    Child(int const& foo):mFoo(foo){}; 
    private: 
    int doToFoo() const{return 0;} 
    int mFoo; 
}; 

int main(){ 
boost::optional<int> optint;  //comment out for surprise 
optint.get();      //comment out for surprise 
boost::optional<Child> res2; 
res2.get(); 
} 

sonrasında bu derler gcc version 4.4.3 kullanarak Derleyen: Aşağıdaki kodu düşünün sıkı bir takma uyarısı olsun. Bunu en az 20 kez kontrol ettim. Bu gördüğüm en tuhaf şeyler arasında. Destek gibi görünüyor: İsteğe bağlı sth. şablon parametresinden bağımsız olarak veya gcc'i desteklemeyi öğrenmek gibi: isteğe bağlı olarak yalnızca sth ile çağrılırsa. Öncelikle önemsiz. Herhangi bir fikir ?

+0

Eğer sıkı aliasing sözettiğimize, size GCC kullanarak varsayabilirsiniz? (Bildiğim ya da başka türlü umursamadığımı bilen tek derleyici) –

+0

@Martin: Başka bir şey yapmadan önce 1.46.1 veya 1.47 beta'yı artırın; 1.44.0'in neredeyse bir yaşında olduğu göz önüne alındığında bunun zaten düzeltilmiş olması oldukça olasıdır. – ildjarn

+0

Sorun nedir? Bu kodda "katı takma" sorunu var mı? – mattn

cevap

4

Bu programı Boost 1.44.0'da denedim. Bu sorun nedeni doToSegment'i geçersiz kılmıyor.

Segment doToSegment(){}; 

const eklemek gerekmektedir:

Segment doToSegment() const {}; 
+0

OOP'lar yukarıdaki örnekte büyük bir hata. Orijinal versiyonda bir const var, yani konu bu değil ama yine de teşekkürler, sadece – Martin

+0

Hmm ... GCC 4.2 & Boost 1.44.0 ile derledim. –

+0

İlginç, -O2'yi açtın mı? Yukarıdaki iş parçacığında tam derleyici komutunu ekledim. Gcc sürüm 4.4.3 kullanıyorum – Martin

İlgili konular