c++编译问题

gg297231604 2020-11-24 05:43:18
程序大概是这样:
template<typename T>
class Avl {
std::list<T*> pdata;
int add(const T *item) {
pdata.push_back(item);
}
};

main() {
node_t a;
Avl<node_t> avl;
avl.add(&a)
}

然后编译报错如下:
In file included from ../Welcome_1/welcome.cc:33:0:
../Welcome_1/Avl.h: In instantiation of ‘int Avl<T>::add(const T*) [with T = node_t]’:
../Welcome_1/welcome.cc:129:15: required from here
../Welcome_1/Avl.h:112:5: error: no matching function for call to ‘push_back(const node_t*&)’
pdata.push_back(item);
^
In file included from /usr/include/c++/5.3.1/list:63:0,
from ../Welcome_1/Avl.h:11,
from ../Welcome_1/welcome.cc:33:
/usr/include/c++/5.3.1/bits/stl_list.h:1088:7: note: candidate: void std::list<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = node_t*; _Alloc = std::allocator<node_t*>; std::list<_Tp, _Alloc>::value_type = node_t*] <near match>
push_back(const value_type& __x)
^
/usr/include/c++/5.3.1/bits/stl_list.h:1088:7: note: conversion of argument 1 would be ill-formed:
In file included from ../Welcome_1/welcome.cc:33:0:
../Welcome_1/Avl.h:112:5: error: invalid conversion from ‘const node_t*’ to ‘std::list<node_t*>::value_type {aka node_t*}’ [-fpermissive]
pdata.push_back(item);

不明白为什么函数参数不匹配,明明 push_back(const value_type& __x) 就应该是 push_back(const node_t*&),请大家帮忙看下。
...全文
343 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-09
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
aaasssdddd96 2020-11-30
  • 打赏
  • 举报
回复
另一种改法,是
std::list<T*> pdata;
这句改成
std::list<const T*> pdata;
这样就没矛盾了.
aaasssdddd96 2020-11-30
  • 打赏
  • 举报
回复
问题是 push_back()中的参数和list<>存储的数据有矛盾, 相差一个const修饰字.
aaasssdddd96 2020-11-30
  • 打赏
  • 举报
回复
只要原文中的那个const修饰字删掉就可以了。
qybao 2020-11-26
  • 打赏
  • 举报
回复
引用 4 楼 gg297231604 的回复:
[quote=引用 1 楼 qybao 的回复:]这是泛型的问题 list<T>这里的T就包括指针了 所以改成 std::list<T> pdata; //泛型用T就可以了 int add(T item) { pdata.push_back(item); return 0; } 调用的时候 node_t a; Avl<node_t*> avl; //这里指定泛型为指针即可 avl.add(&a); lz自己对比一下区别吧
这样是可以,我只是不明白我那个有什么问题。 另外这个版本我不知道怎么实现使用指针的运算符重载(==, <)。[/quote]2L已经给你回答了 你先看看以下的区别能否理解? const int* a 和 int* const a 前者是*a不能改变但a可变,后者是a不能改变但*a可变 如果能理解,你就把你的node_t* 套到push_back的参数类型去比较一下就知道了(也就是2L说的)
yshuise 2020-11-25
  • 打赏
  • 举报
回复
引用 6 楼 gg297231604 的回复:
[quote=引用 3 楼 yshuise 的回复:]
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <list>

class node_t {};
template<typename T>
class Avl {
public:
    std::list<T*> pdata;
    int add(const T* item) {
        pdata.push_back(item);
        return 0;
    }
};


int main()
{
    node_t a;
    Avl<const node_t> avl;
    avl.add(&a);
}
我试了下,不行啊,你编译没问题吗? [/quote]我的能用
gg297231604 2020-11-25
  • 打赏
  • 举报
回复
引用 3 楼 yshuise 的回复:
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <list>

class node_t {};
template<typename T>
class Avl {
public:
    std::list<T*> pdata;
    int add(const T* item) {
        pdata.push_back(item);
        return 0;
    }
};


int main()
{
    node_t a;
    Avl<const node_t> avl;
    avl.add(&a);
}
我试了下,不行啊,你编译没问题吗?
gg297231604 2020-11-25
  • 打赏
  • 举报
回复
引用 2 楼 Minikinfish 的回复:
楼主: push_back(const value_type& __x) 与push_back(const node_t*&)是不一样的 value_type被编译成node_t*,但是,函数参数是(const value_type& __x),此时的const修饰&,等价于(value_type const & __x) 所以, push_back(const value_type& __x)等价于push_back(node_t* const &) push_back还有一种重载,右值引用 void push_back(_Ty&& _Val) &&,就是右值引用了(一个&是左值引用)。
虽然不太明白,我觉得你应该是对的。 如果向一楼那样的实现,其push_back为什么又可以匹配了呢?
gg297231604 2020-11-25
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
这是泛型的问题 list<T>这里的T就包括指针了 所以改成 std::list<T> pdata; //泛型用T就可以了 int add(T item) { pdata.push_back(item); return 0; } 调用的时候 node_t a; Avl<node_t*> avl; //这里指定泛型为指针即可 avl.add(&a); lz自己对比一下区别吧
这样是可以,我只是不明白我那个有什么问题。 另外这个版本我不知道怎么实现使用指针的运算符重载(==, <)。
yshuise 2020-11-24
  • 打赏
  • 举报
回复
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <list>

class node_t {};
template<typename T>
class Avl {
public:
std::list<T*> pdata;
int add(const T* item) {
pdata.push_back(item);
return 0;
}
};


int main()
{
node_t a;
Avl<const node_t> avl;
avl.add(&a);
}

Minikinfish 2020-11-24
  • 打赏
  • 举报
回复
楼主: push_back(const value_type& __x) 与push_back(const node_t*&)是不一样的 value_type被编译成node_t*,但是,函数参数是(const value_type& __x),此时的const修饰&,等价于(value_type const & __x) 所以, push_back(const value_type& __x)等价于push_back(node_t* const &) push_back还有一种重载,右值引用 void push_back(_Ty&& _Val) &&,就是右值引用了(一个&是左值引用)。
qybao 2020-11-24
  • 打赏
  • 举报
回复
这是泛型的问题 list<T>这里的T就包括指针了 所以改成 std::list<T> pdata; //泛型用T就可以了 int add(T item) { pdata.push_back(item); return 0; } 调用的时候 node_t a; Avl<node_t*> avl; //这里指定泛型为指针即可 avl.add(&a); lz自己对比一下区别吧

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧