我想使用此代码定义一些通用指针(?但不是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使这个编译?
const ptr<ubyte>与 相同,const (ubyte *)与不同const ubyte (*)。您试图返回一个const指向非 const 的指针char,编译器不允许这样做,因为您已经声明了函数本身const;const所有成员都因此而成为。编译器不会自动将 const 转换为没有const_cast.
为了使区别更清楚,第一个是指向非常量的 const 指针char,第二个是指向 const 的非常量指针char。第一个允许改变指向的字符,即使指针本身不能改变。由于该函数被标记为const它不能返回任何允许修改其成员的内容。
修复它的最佳方法:
ptr<const ubyte>
getColor1() const {
return &colors[0];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |