将模板化T定义为指针

时间:2014-03-04 02:00:10

标签: c++ pointers

我想使用以下代码定义一些通用指针(?但不是空指针):

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];
}

来自option1,

现在构建到const constconst const意味着什么?

来自option2,

为什么只删除cv-qualifier会使这个编译?

3 个答案:

答案 0 :(得分:4)

const ptr<ubyte>const (ubyte *)相同, const ubyte (*)相同。您正在尝试将const指针返回到非const char,编译器将不允许这样,因为您已声明函数本身const;因此,所有成员都成为const。如果没有const_cast,编译器不会自动将const转换为非const。

为了使差异更清楚,第一个是指向非const char的const指针,第二个是指向const char的非const指针。第一个允许指向字符改变,即使指针本身不能改变。由于该函数被标记为const,因此无法返回任何允许其成员被修改的内容。

解决问题的最佳方法:

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

答案 1 :(得分:1)

由于ptr模板的语法,const ptr<ubyte>首先使其成为ubyte*,然后应用const,从而产生ubyte * const,一个指向UBYTE。

为了返回指向const ubyte的指针,您需要将const ubyte提供给指针模板,因此首先应用constness:

ptr<const ubyte>

答案 2 :(得分:1)

1)“const const意味着什么?”

const T* const pT = new T;

表示const指针pT - 您不能将pT指定给另一个对象; 到类型为T的const对象 - 你不能改变pT指向的对象。

2)“为什么只删除cv-qualifier会使这个编译?”

getColor1()

没有const modifier的方法可以修改对象。它现在返回A :: ubyte *,它可以转换为const类型,例如声明为返回类型:A :: ubyte * const(const ptr&lt; ubyte&gt;)