2012-01-17 29 views
4

我有一個對象是合法的在初始化器列表使用返回臨時功能

Segment::Segment(QPointF const& start, QPointF const& end): 
    mOrigin(toVector3df(start)),mEnd(toVector3df(end)){  
} 

mOrigin的下面的構造是Vector3df型和toVector3df(QPointF const&)返回臨時Vector3df功能。到現在爲止還挺好。代碼編譯得很好,並且像linux下的魅力一樣工作,gcc 4.4.3。大多數警告被激活。

現在我想交叉編譯的諾基亞智能手機(Meamo弗里曼特爾) 和突然的相同的代碼,我得到很奇怪的編譯器警告:

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'內部的變量名爲this.902,所以我的第一個問題是:「有人看到過這樣的警告嗎?」另外Vector3df構造函數沒有錯,它們非常簡單,toVector3df(QPointF const&)是一個非線性的非成員模板函數,可以在代碼的其他部分工作。 Vector3df繼承自只定義非成員函數的模板,沒有變量no,虛函數。

其次,當我在上面的代碼更改爲以下

Segment::Segment(QPointF const& start, QPointF const& end): 
    mOrigin(),mEnd(){ 
    mOrigin = toVector3df(start); 
    mEnd = toVector3df(end); 
} 

的代碼工作正常,沒有任何警告。 那麼我在這裏錯過了什麼?有沒有人知道警告的起源可能是什麼。我違反了一些我不知道的原則嗎? fremantle編譯器(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沒有繼承一切正常。

+0

'toVector3df'是否是成員函數? – 2012-01-17 17:19:04

+0

沒有非會員模板 – Martin 2012-01-17 17:22:44

+0

你可以在一個小例子中重現這個問題,你可以粘貼到問題中嗎? – 2012-01-17 17:34:23

回答

3

使用返回成員初始值設定項列表中的臨時函數沒有任何問題。
即使成員將被撤銷的順序在標準中也有很好的定義。

+0

好的,這也是我的印象,看到它確認後鬆了一口氣。想知道編譯器在抱怨什麼? – Martin 2012-01-17 17:20:45

+0

@Martin:你可以創建一個小的簡約獨立代碼,並在編譯器中編譯問題以重現錯誤? – 2012-01-17 17:23:01

+0

最後是的,看我的編輯。如果你想嘗試它,請注意編譯器參數。有點不同(沒有O3)不會導致錯誤 – Martin 2012-01-17 18:31:05