イニシャルリストの一時的なリストを返す関数を使用することは合法ですか
質問
私はオブジェクトの次のコンストラクターを持っています
Segment::Segment(QPointF const& start, QPointF const& end):
mOrigin(toVector3df(start)),mEnd(toVector3df(end)){
}
mOrigin
タイプです Vector3df
と関数 toVector3df(QPointF const&)
一時的なものを返します Vector3df
. 。ここまでは順調ですね。コードは微細にコンパイルされ、Linuxの下の魅力のように機能します。GCC4.4.3。ほとんどの警告がアクティブ化されました。
今、私はNokiaスマートフォン(Meamo Fremantle)の同じコードをクロスコンパイルしたかったのですが、突然、非常に奇妙なコンパイラ警告が得られました。
include/vector3d.h: In constructor 'Segment::Segment(const QPointF&, const QPointF&)':
include/vector3d.h:64: warning: 'this.902' is used uninitialized in this function
include/vector3d.h:64: note: 'this.902' was declared here
まず:もちろん、これを「vecto3df」内にある902と呼ばれる実際の変数はありません。私の最初の質問は、「誰かがこのような警告を見たことがありますか?」さらに何も悪いことはありません Vector3df
コンストラクター、彼らは非常にシンプルで、 toVector3df(QPointF const&)
コードの他の部分で完全に機能する1つのライナーの非メンバーテンプレート関数です。Vector3df
非会員関数のみを定義するテンプレートから継承し、変数はない、仮想関数。
第二に、上記のコードを次のように変更するとき
Segment::Segment(QPointF const& start, QPointF const& end):
mOrigin(),mEnd(){
mOrigin = toVector3df(start);
mEnd = toVector3df(end);
}
コードは警告なしに正常に動作します。それで、私はここで何が欠けていますか?警告の起源が何であるかを誰かにアイデアを持っています。私は私が知らないいくつかの教義に違反していますか?フリーマントルコンパイラ(Maemo 5、QT 4.6.2)はより深刻ですか、それともバギーですか?
よろしくお願いします、マーティン
編集:ここに最小限の例があります、長さで申し訳ありません:P
#include <iostream>
#include <sstream>
#include <QPoint>
template<typename T> class IoEnabled {};
template<typename T>
class Vector3d: public IoEnabled<Vector3d<T> > {
private:
T mX; T mY; T mZ;
public:
Vector3d(T const& x, T const& y, T const& z=0.0) : mX(x), mY(y), mZ(z) {}
};
typedef Vector3d<float> Vector3df;
template<class T>
Vector3df toVector3df(T const& p){
return Vector3df(p.x(),p.y(),0.0);
}
class Segment {
private:
Vector3df mOrigin; Vector3df mEnd;
public:
Segment(QPointF const& start, QPointF const& end):
mOrigin(toVector3df(start)),mEnd(toVector3df(end)){
//if toVector3df(...) is moved from the initializer to the body it works
}
};
int main(int argc, char **argv) {
(void) argc; (void) argv;
Segment temp(QPointF(1,2),QPointF(3,4));
return 0;
}
コンパイラコール:
g++ -c -pipe -Werror -Wall -Wextra -Wunused -Wundef -Wpointer-arith -Wcast-align -Wwrite-strings -Wredundant-decls -O3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -D_REENTRANT -Wall -W -DQT_GL_NO_SCISSOR_TEST -DQT_DEFAULT_TEXTURE_GLYPH_CACHE_WIDTH=1024 -DMAEMO -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/opt/QtSDK/Maemo/4.6.2/sysroots/fremantle-arm-sysroot-20.2010.36-2-slim/usr/share/qt4/mkspecs/linux-g++-maemo5 -I. -I/opt/QtSDK/Maemo/4.6.2/sysroots/fremantle-arm-sysroot-20.2010.36-2-slim/usr/include/QtCore -I/opt/QtSDK/Maemo/4.6.2/sysroots/fremantle-arm-sysroot-20.2010.36-2-slim/usr/include/QtGui -I/opt/QtSDK/Maemo/4.6.2/sysroots/fremantle-arm-sysroot-20.2010.36-2-slim/usr/include -Isrc -Irelease/moc -o release/obj/main.o src/main.cpp
Vector3Dがすべてを正常に継承しない場合、テンプレートの継承は重要であると思われます。
正しい解決策はありません