将模板化T定义为指针

mr5*_*mr5 5 c++ pointers

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

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];
};
Run Code Online (Sandbox Code Playgroud)

但是,getColor1()不会编译.这两个功能有什么区别?

gcc说:

error: invalid conversion from 'const ubyte* {aka const unsigned char*}' to 'A::ptr<unsigned char> {aka unsigned char*}' [-fpermissive]|
Run Code Online (Sandbox Code Playgroud)

更新:

删除的答案说我可以这样做:

//option 1
template<typename T>
using const_ptr = const T*;
Run Code Online (Sandbox Code Playgroud)

要么

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

来自option1,

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

来自option2,

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

Mar*_*som 4

const ptr<ubyte>与 相同,const (ubyte *)不同const ubyte (*)。您试图返回一个const指向非 const 的指针char,编译器不允许这样做,因为您已经声明了函数本身constconst所有成员都因此而成为。编译器不会自动将 const 转换为没有const_cast.

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

修复它的最佳方法:

ptr<const ubyte>
getColor1() const {
    return &colors[0];
}
Run Code Online (Sandbox Code Playgroud)