C ++谁将结构存储在堆栈中(STL)

时间:2015-04-15 18:46:42

标签: c++ struct stl stack

我遇到这样的问题: C++: Storing structs in a stack

我的代码:

#include <stdio.h>
#include <stack>
#include <iostream>
#include <string>
using namespace std;

struct adresse{

    string info;
};

int main(){

    string eingabe;
    stack<adresse> Stack1;

    cout << "Bitte Ausdruck eingeben: " << endl;
    getline( cin, eingabe);

    adresse* temp;
    temp = new adresse;
    temp->info = eingabe[0];
    Stack1.push(temp);

    return 0;  
}

错误是:

reference to type 'const value_type'(aka 'const adresse') could not bind to an 
lvalue of type 'adresse *'Stack1.push(temp);

有什么问题?

由于

托米

5 个答案:

答案 0 :(得分:5)

adresse temp;
temp.info = eingabe;
Stack1.push(temp); // maybe `std::move(temp)` instead of `temp`

而不是new以及您使用temp所做的事情。此处不需要new[0]不是必需的。指针不是必需的。

一般来说,new表示&#34;创建一个副本,我将手动管理其生命周期,并且访问速度较慢&#34;。它返回指向new ed的事物的指针。如果您不需要对所创建内容的生命周期进行细粒度控制,请在堆栈中创建它。

在一些现代C ++编码样式中,不鼓励在特定低级别资源管理功能之外调用new(例如make_sharedmake_uniqueboost::variant等)。但是你仍然需要理解指针。

您创建了一个指向某些数据的指针,并尝试将其存储在需要某些数据值的容器中。容器需要引用它将复制的现有数据块:您为它指定了一些指向某些数据的指针。这些类型不同,因此编译器给出了一个错误,指出无法自动从一种类型转换为另一种类型。

答案 1 :(得分:0)

您声明您的堆栈包含adresse,但是正在尝试推送adresse地址

答案 2 :(得分:0)

首先要做你正在做的事情,你需要一个像这样的堆栈,

stack<adresse*> Stack1;

如果你想使用自己的堆栈,那就按这样推送

Stack1.push(*temp);

答案 3 :(得分:0)

撰写Stack1.push(temp)时,tempadresse *,而Stack1.push则需要adresse const &参数。

这是编译器试图告诉你的。

要解决此问题,请不要将temp存储为指向对象的指针,而是直接存储为对象。

答案 4 :(得分:0)

你有一些问题。

首先,您的标题<stdio.h>是一个C标题,C++使用<cstdio>

接下来,您将创建一个指向对象的指针,并尝试将该指针推送到堆栈上。无需制作指针,只需直接定义对象即可。

最后使用eingabe[0]只会为您提供eingabe中存储的单词的第一个字母。

尝试以下方法:

//#include <stdio.h> // not this in C++
#include <cstdio> // use this instead
#include <stack>
#include <iostream>
#include <string>
using namespace std;

struct adresse
{

    string info;
};

int main()
{

    string eingabe;
    stack<adresse> Stack1;

    cout << "Bitte Ausdruck eingeben: " << endl;
    getline(cin, eingabe);

    // no need to make pointers just use
    // adresse as if it were built in
    adresse temp;
    temp.info = eingabe; // [0] will only give you the first letter
    Stack1.push(temp);

    return 0;
}