2014-03-04 26 views
5

我要定義一些通用指針(但不是一個空指針?):使用此代碼定義模板T作爲指針

class A 
{ 

template<typename T> 
using ptr = T*; 

using ubyte = uint8_t; 

public: 

    const ptr<ubyte> 
    getColor1() const { 
     return &colors[0]; 
    } 

    const ubyte* 
    getColor2() const { 
     return &colors[0]; 
    } 


private: 

    ubyte colors[4]; 
}; 

然而,getColor1()將無法​​編譯。 這兩個功能有什麼區別?

GCC說:

error: invalid conversion from 'const ubyte* {aka const unsigned char*}' to 'A::ptr<unsigned char> {aka unsigned char*}' [-fpermissive]| 

更新:

刪除的回答說:我可以這樣做:

//option 1 
template<typename T> 
using const_ptr = const T*; 

//option 2 
const ptr<ubyte> 
getColor() //remove cv-qualifier 
{ 
    return &colors[0]; 
} 

從選項1開始,

它現在構建到const constconst const是什麼意思?

從option2中,

爲什麼只是刪除cv-qualifier會使這個編譯?

+0

@ 0x499602D2我把錯誤信息放在我的文章中。 – mr5

+0

選項2使它編譯,但不做你想要的。它返回一個const指針到一個非常量的ubyte,但是你不能指定一個新的指針到返回值,所以const是相對無用的:) – melak47

+0

@ melak47謝謝,這是有道理的。 – mr5

回答

4

const ptr<ubyte>const (ubyte *)相同,即不是const ubyte (*)相同。您試圖將const指針返回到非const char,編譯器不會允許它,因爲您已聲明函數本身const;因此,所有成員都成爲const。沒有const_cast,編譯器不會自動將const強制轉換爲非const。

爲了使區別更清楚,第一個是一個const指針指向非const的指針,第二個指針指向const的非常量指針char。第一個允許指向字符改變,即使指針本身不能改變。由於該函數被標記爲const,因此它不能返回任何可以修改其成員的內容。

,最好的辦法來解決它:

ptr<const ubyte> 
getColor1() const { 
    return &colors[0]; 
} 
+0

'const(ubyte *)'不是一個有效的type-id。你的意思是'ubyte * const'。 –

+0

@AndrewTomazos,實際上我認爲我的意思是'ubyte(* const)':http://ideone.com/GQy6yx。我討厭指針和類型修飾符的C/C++語法,它根本不直觀。 –

+0

'ubyte * const'和'ubyte(* const)'是等價的,括號是多餘的:請參閱http://ideone.com/iCeYcz是的,C++聲明符的優先級需要一些時間來學習。搜索「螺旋規則」。 –

1

因爲你ptr模板的語法,const ptr<ubyte>第一使它成爲ubyte*,然後一個常量指針應用常量,導致ubyte * const,到UBYTE 。

爲了返回一個指向一個const UBYTE,你需要一個const ubyte送入指針的模板,所以常量性被首次應用於:「什麼呢常量const的意思是」

ptr<const ubyte> 
1

1)

const T* const pT = new T; 

表示const指針pT - 不能將pT分配給另一個對象; 添加到T類型的常量對象 - 您不能更改由pT指向的對象。

2)「爲什麼只要刪除cv-qualifier就可以編譯?」

getColor1() 

方法沒有const modifier可以修改對象。它現在返回A :: ubyte *,它可以轉換爲常量類型,如聲明爲返回類型:A :: ubyte * const(const ptr < ubyte>)

+0

這是無效的。你的意思是'const T * const pT'。 –

+0

我的意思是'const const T *',而不是''cv-qualifier'' – mr5

+0

'T *','const T *','T * const'和'const T * const'都是有效且不同的類型。 'const const T *'無效。 –