2013-05-05 47 views
1

我想超載operator<<Graph類,但我不斷收到各種錯誤:重載流插入操作失誤,將無法編譯

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
error C2143: syntax error : missing ',' before '<' 

我有原型operator<<放在右邊的Graph類以上定義。 operator<<的定義位於文件的最底部。這些錯誤與標頭警衛有什麼關係?

這裏的Graph.h

#ifndef GRAPH 
#define GRAPH 

#include <iostream> 
#include <vector> 
#include <map> 
#include <sstream> 
#include "GraphException.h" 
#include "Edge.h" 

using namespace std; 

template <class VertexType> 
ostream& operator<<(ostream& out, const Graph<VertexType>& graph); 

/** An adjacency list representation of an undirected, 
* weighted graph. */ 

template <class VertexType> 
class Graph 
{ 
    friend ostream& operator<<(ostream& out, const Graph& graph); 
    // stuff 

} 


template <class VertexType> 
ostream& operator<<(ostream& out, const Graph<VertexType>& graph) 
{ 
    return out; 
} 

#endif GRAPH 

和這裏的main

#include <iostream> 
#include "Graph.h" 

using namespace std; 

const unsigned MAX_NUM_VERTICES = 9; 

int main() 
{ 
    // create int graph: 

Graph<int> iGraph(MAX_NUM_VERTICES); 

    // add vertices and edges 

    cout << iGraph; 


    return 0; 
} 
+0

如果您嘗試製作[SSCCE](http://www.sscce.org/),人們將來會更有幫助。以這種方式思考的一個好的副作用是,在發佈問題之前,你可能會找出你的問題。 – 2013-05-05 06:32:08

+0

謝謝,我不知道SSCCE。我編輯了所有我覺得無關的東西。事情是,我通常不是什麼無關緊要的事情的最佳仲裁者。 – JamesGold 2013-05-05 06:40:58

+0

什麼是'iGraph'? – juanchopanza 2013-05-05 08:05:09

回答

0

operator<<聲明缺少Graph聲明。一個解決方案是operator<<聲明之前將類聲明:

template <class VertexType> 
class Graph; 

也可以忽略的operator<<聲明完全是類外,作爲friend聲明構成的operator<<非成員申報爲好。

+0

刪除運算符<<的聲明產生了另一個錯誤:LNK1120:1個未解析的外部文件 – JamesGold 2013-05-05 06:30:38

+0

@JamesGold:對不起,我手邊沒有Visual Studio。我的兩個建議都適用於Apple Clang 4.2和GCC 4.2.1。你也可以嘗試'template friend ostream&operator <<(ostream&,const Graph &);''就是說,'operator <<'是'Graph '的朋友,不僅適用於'V' 'VertexType'。 – 2013-05-05 06:40:56