2011-11-12 85 views
16

我有一個類,我嘗試初始化,但得到錯誤「沒有匹配的構造函數初始化'TextureCoordinates'」;C++「沒有匹配的構造函數初始化」編譯器錯誤

類,我想初始化:

class TextureCoordinates 
{ 
public: 
    TextureCoordinates(){}; 
    TextureCoordinates(Point2D& origin, Dimensions2D& dim); 
    Point2D getOrigin() const {return origin;}; 
    Dimensions2D getDim() const {return dim;}; 
private: 
    Point2D origin; 
    Dimensions2D dim; 
}; 

線與編譯器錯誤:

TextureCoordinates result(point, Dimensions2D(width, height)); 

構造函數的定義:

TextureCoordinates::TextureCoordinates(Point2D& origin, Dimensions2D& dim): 
origin(origin), dim(dim) {} 

任何想法,我在做什麼錯誤?

+0

哪裏的構造函數的定義是什麼?我所看到的只是宣言。 – Pubby

+0

我剛添加它。 – Xavier

回答

16

您的構造函數通過非const引用獲取參數,但是您將一個臨時對象(Dimensions2D(width, height))傳遞給它。臨時,即使是非常量的,也不會綁定到非常量引用。

解決方案,讓您的構造函數取常量引用(它不應該修改傳遞的對象反正):

TextureCoordinates(Point2D const& origin, Dimensions2D const& dim); 
4
TextureCoordinates result(point, Dimensions2D(width, height)) 

第二個參數是不能被綁定到左值引用構造函數需要一個右值:

TextureCoordinates(Point2D& origin, Dimensions2D& dim); 

您可以通過更改構造函數的簽名

修復
TextureCoordinates(Point2D& origin, const Dimensions2D& dim); 
TextureCoordinates(Point2D& origin, Dimensions2D&& dim); // alternative for c++11 

(如果你能) 或使參數變量

Dimension2D dim=Dimensions2D(width, height); 
TextureCoordinates result(point, dim) 
-1

你寫的實現:

TextureCoordinates(Point2D& origin, Dimensions2D& dim); 
0

聲明Dimensions2d之外。

Dimension2d d(width, height); 
TextureCoordinates result(point, d); 
0

臨時變量不能在C基準傳遞++,因爲這樣你可以改變功能的臨時對象是很快就要消失的價值!沒有這樣的問題存在參考常數..... 所以你的函數定義應該像

TextureCoordinates(Point2D const& origin, Dimensions2D const& dim); 
相關問題