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 ?
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) –
@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
Sorun nedir? Bu kodda "katı takma" sorunu var mı? – mattn