错误C2923:'std :: vector':'Edge'不是参数'_Ty'的有效模板类型参数?

时间:2016-02-17 06:26:50

标签: c++

嗨......

    #ifndef Node_H
    #define Node_H
    #include <vector>
    #include <stack>
    #include <string>
    #include <iostream>
    #include "Edge.h"
    #include "CongestionMap.h"
    using namespace std;   
    class Node
    {

    public:
        Node(){ visit = false;};
    Node(int id);
    ~Node(); 
    int getID();
    void setLocation(int &row, int &col, GridCell *Gc);;
    void displayList();

    private:
        int row;
        int col;
        int id;
        bool visit;
        int parrent;
        int distance;
        typedef vector<  Edge > adjNodeList;

    };
    #endif 

当我编译项目时,我得到错误 project \ node.h(43):错误C2065:'Edge':未声明的标识符 project \ project \ node.h(43):错误C2923:'std :: vector':'Edge'不是参数'_Ty'的有效模板类型参数...     请帮我 ... Edge.h

#ifndef Edge_H
#define Edge_H
#pragma once
#include <vector>
#include <stack>
#include <string>
#include <iostream>
#include "Node.h"

using namespace std;

class Edge
{
public:
    Edge() {};
Edge(Node *firstNode, Node *secNode, int inCost);
~Edge(void);

Node* getDstNode();
Node* getOrgNode();
int   getCost();

private:
Node *orgNode;
Node *dstNode;
int cost;

};
#endif

1 个答案:

答案 0 :(得分:7)

正如一些评论者所指出的那样,你有循环引用。代码按其出现的顺序进行解析。

如果我们从早期开始node.h,则其中包含edge.h

edge.h包括node.h,但由于#ifdef保护,以及冗余的#pragma once(他们都实现了同样的目标),因此巧妙地无法做任何事情,所以你可能会考虑只坚持一种方法。)

好的,我们遇到的第一个类定义是Edge。太棒了,除了引用Node之外,没有人知道那是什么......因为我们仍然在edge.h的代码中已被包含在node.h中}。

可能你反而发生了事情,edge.h首先被包括在内。接下来发生的事情是包含node.h,并声明Node,它希望知道Edge是什么,但是还没有人看到过。

因此,在宣布edge.h之前,您需要使用class EdgeNode,添加一行说明class Node;

node.h

相反,在Edge中,为node.h提供前瞻性声明。第二个是涵盖某人在edge.h之前包含class Node; // forward declaration so that compiler knows that // Node is a class when it gets to parsing Edge class Edge { ... private: Node *orgNode; }; class Node { .... }; } 的情况。

例如,如果你在同一个文件中声明它们,你仍然需要做类似的事情:

dat1 <- data.frame(x=c('A','A','B','B'), y=c('A','B','C','D'), val = 1:4)
dat2 <- data.frame(val = 1:4)
dat_group <- data.frame(x=c('A','A','B','B'))

# invalid subscript type 'integer'
dat1 %>%
  group_by(dat1$x) %>%
  mutate(y = sum(unique(y) %in% c("A","B","C")))

# invalid subscript type 'list'
dat2 %>%
  group_by(dat_group$x) %>%
  mutate(y = sum(unique(y) %in% c("A","B","C")))