【问题标题】:Why am I getting "invalid conversion from const pointer to pointer?为什么我会收到“从 const 指针到指针的无效转换?
【发布时间】:2018-10-18 19:38:37
【问题描述】:

我正在使用链接列表,特别是我正在尝试附加一个对象。 append 函数传递了一个指向我要添加的对象的指针。

此指针随后用于初始化 OULink(列表节点)对象。

在我的 OULink 类中,我试图将数据指针设置为 = 我要添加的对象,这就是我遇到错误的地方:

错误:从 'const NvraRecord*' 到 'NvraRecord*' 的无效转换 [-fpermissive] this->data = item;

我想既然它们都是 T* 类型,我可以将一个分配给另一个。

template <typename T>
class OULinkedList {
    template <typename F>
    friend class OULinkedListEnumerator;
private:
    Comparator<T>* comparator = NULL;               // used to determine list order and item equality
    unsigned long size = 0;                         // actual number of items currently in list
    OULink<T>* first = NULL;                        // pointer to first link in list
    OULink<T>* last = NULL;                         // pointer to last link in list
public:
    OULinkedList(Comparator<T>* comparator);        // creates empty linked list with comparator
    virtual ~OULinkedList();                        // deletes all links and 
template <typename T>
bool OULinkedList<T>::append(const T* item) {


    if(this->first == NULL){

        OULink<NvraRecord> currentNode(item);
        this->first = &currentNode;

    }else{

    }
    std::cout << *this->first->data << std::endl;
    return false;
}



template <typename T>
class OULink {
    template <typename F>
    friend class OULinkedList;
    template <typename F>
    friend class OULinkedListEnumerator;
private:
    T* data = NULL;                                     // pointer to data item of any type
    OULink* next = NULL;                                // pointer to next link
public:
    OULink(const T* item);
    virtual ~OULink();
};

template<typename T>
OULink<T>::~OULink(){

}
// Implementation goes here
template<typename T>
OULink<T>::OULink(const T* item){

    this->data = item;
}

【问题讨论】:

  • 您不能将const T * 分配给T *。允许它允许您修改 const 对象。如果const int * x 指向const int i,那么如果你用int * y = x; 为指针分配了一个非常量指针,那么你可以使用y 来尝试修改i
  • “我想既然它们都是 T* 类型,我可以将一个分配给另一个。”它们都不是T* 类型。一个是T const * 类型。
  • @Swordfish 好吧,我原本以为它们都是一样的,但是你不能修改 const T* 的内容。
  • this-&gt;first = &amp;currentNode; 是一个错误,你存储了一个立即销毁的局部变量的地址

标签: c++ templates pointers linked-list type-conversion


【解决方案1】:

OULink 构造函数采用 const T* item,它是一个指向 const T 的指针。OULink.data 可以存储一个 T*,它是一个指向非 const T 的指针。

您不能将const T* 分配给T*,因为const 是一份合同,上面写着“我不会让我指向的对象发生变化”。如果您可以分配给T*,则该指针将允许修改对象,这将破坏该合同。

您可能希望将构造函数 OULink(const T* item); 更改为 OULink(T* item);

【讨论】:

  • 所以,我无法修改任何声明。但是,我确实通过使用 const_cast(item) 找到了解决方法,但我不确定这是否是预期的点,或者我们的讲师是否有错误。
  • 如果您使用const_cast&lt;&gt; 来克服您的教师所犯的错误,您应该添加注释,说明修改const 对象是未定义的行为:eel.is/c++draft/dcl.type.cv#4
  • 可能是打算复制指向的输入项?
  • const_cast 是魔鬼。不如 C 预处理器(即 THE DEVIL)糟糕,但仍然相当邪恶。
猜你喜欢
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 2011-01-14
  • 2015-09-10
  • 1970-01-01
  • 2012-07-23
相关资源
最近更新 更多