-5

我在C++中有点新,在尝试编译这段代码时,我得到了一个我不知道如何修复的错误:

int main()
{
    typedef pair<int,int> nodo;
    int x;
    cin >> x; 
    int *g;                
    g = new int[x];   

    vector <nodo> g;


    g[1].push_back(nodo(2,5));
    g[1].push_back(nodo(3,10));
    g[3].push_back(nodo(2,12));
    g[2].push_back(nodo(4,1));
    g[4].push_back(nodo(3,2));

    for (int i = 1; i <=4; ++i){
        //    cout << i << " -> ";
        for (int j = 0; j<g[i].size(); ++j){
            //    cout << g[i][j].first << " c: " << g[i][j].second << " ";    
        }
        //   cout << endl;
    }

    dijkstra(1, x);
    system("pause");
    return 0;
}

我收到的错误是:

Error: Expression must have a class type.
4

5 回答 5

4

这里:

int *g;
g = new int[x];
vector <nodo> g; // ERROR: Redeclaration!

您首先声明g为 type int*,然后重新声明为 type vector<nodo>。这是非法的。

using namespace std此外,如果您想省略std::标准命名空间中类型的限定条件,则需要有一个指令。我不建议你使用它。更好地明确指定std::,或者更确切地说使用特定的using声明。

例如:

    typedef std::pair<int,int> nodo;
//          ^^^^^
    int x;
    std::cin >> x;
//  ^^^^^
    int *g;
    g = new int[x];

    std::vector <nodo> g;
//  ^^^^^

还要确保您正在导入所有必要的标准标头:

    Type     |  Header
--------------------------
std::vector -> <vector>
std::pair   -> <utility>
std::cin    -> <iostream>
于 2013-03-06T21:08:32.317 回答
1

您正在重新声明g,首先它是 anint*然后您将其变为 a vector<int>。我不确定它是如何通过编译器的。

此外,与其使用,不如nodo(1,2)考虑使用make_pair。使用new也被认为是不好的做法,您应该使用动态容器std::vector或静态容器,如std::array.

于 2013-03-06T21:08:23.097 回答
0

pair不是一个类,因为你没有包括<utility>

你也没有包括<vector>or <iostream>

于 2013-03-06T21:08:44.547 回答
0

你有两个东西命名g

int* g;

vector <nodo> g;

这甚至不会编译。

看起来你想要一个向量数组,在这种情况下你需要类似的东西

std::vector<std::vector<nodo> > g(x); // size x vector of vectors.

然后你可以做这种事情:

g[1].push_back(nodo(2,5));
g[1].push_back(nodo(3,10));
于 2013-03-06T21:09:17.653 回答
0

所以这个版本可以编译,我认为这就是你要做的:

// Need to include these headers
#include <utility>
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    typedef pair<int,int> nodo;
    int x;
    cin >> x; 
    //int *h;                
    //h = new int[x];   

    //specify size of vector
    std::vector< std::vector<nodo> > g(x);

    g[0].push_back(nodo(2,5));
    g[1].push_back(nodo(3,10));
    g[2].push_back(nodo(2,12));
    g[3].push_back(nodo(4,1));
    g[4].push_back(nodo(3,2));


    for (int i = 0; i < g.size(); ++i){
        std::cout << i << " -> ";
        for (int j = 0; j<g[i].size(); ++j){
                cout << g[i][j].first << " c: " << g[i][j].second << " ";    
        }
         cout << endl;
    }

    //dijkstra(1, x);
    //system("pause");
    return 0;
}

很多问题,你g一次用两次。我不确定你想做什么,vector但也许你想要一个更像这样vector的s:vector

 std::vector< std::vector<nodo> > g(x) ;

那么这将更有意义:

 g[0].push_back(nodo(2,5)) ;

a 的第一个元素vector将在0not 1

于 2013-03-06T21:12:32.967 回答