Solved

BOOST: GRAPH    Demo Code

Posted on 2007-11-22
8
3,555 Views
Last Modified: 2010-04-21
Hello,

Im new to the Boost Graph lib. I want to run the demp code lines from the tutorial page:
  http://www.boost.org/libs/graph/doc/quick_tour.html

I failed running the template code with a error message I can't help myself.

Here ist the compilers (MS Visual C++)  feed back .-), the code comes in the attachment
----------------------------------------------------------------------------------------------------------------------

------ Build started: Project: boost_demo_v01, Configuration: Debug Win32 ------
Compiling...
boost_demo_v01.cpp
c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\boost_demo_v01.cpp(20) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
        c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\boost_demo_v01.cpp(40) : see reference to class template instantiation 'exercise_vertex<Graph>' being compiled
c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\boost_demo_v01.cpp(20) : error C2143: syntax error : missing ',' before '&'
c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\boost_demo_v01.cpp(20) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
        c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\boost_demo_v01.cpp(147) : see reference to class template instantiation 'exercise_vertex<Graph>' being compiled
        with
        [
            Graph=Graph
        ]
c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\boost_demo_v01.cpp(20) : error C2143: syntax error : missing ',' before '&'
c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\boost_demo_v01.cpp(147) : error C2440: '<function-style-cast>' : cannot convert from 'Graph' to 'exercise_vertex<Graph>'
        with
        [
            Graph=Graph
        ]
        No constructor could take the source type, or constructor overload resolution was ambiguous
Build log was saved at "file://c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\Debug\BuildLog.htm"
boost_demo_v01 - 5 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========




// boost_demo_v01.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
 
  #include "stdafx.h"
  #include <iostream>                  // for std::cout
  #include <utility>                   // for std::pair
  #include <algorithm>                 // for std::for_each
  #include <boost/graph/graph_traits.hpp>
  #include <boost/graph/adjacency_list.hpp>
  #include <boost/graph/dijkstra_shortest_paths.hpp>
 
 
  using namespace boost;
 
 
 
 
template <class Graph> struct exercise_vertex {
    //...
    void operator()(const Vertex& v) const
    {
      typedef graph_traits<Graph> GraphTraits;
      typename property_map<Graph, vertex_index_t>::type 
        index = get(vertex_index, g);
 
      std::cout << "out-edges: ";
      typename GraphTraits::out_edge_iterator out_i, out_end;
      typename GraphTraits::edge_descriptor e;
      for (tie(out_i, out_end) = out_edges(v, g); 
           out_i != out_end; ++out_i) {
        e = *out_i;
        Vertex src = source(e, g), targ = target(e, g);
        std::cout << "(" << index[src] << "," 
                  << index[targ] << ") ";
      }
      std::cout << std::endl;
      //...
    }
    //...
  };
 
 
 
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
 
/*Constructing a Graph
In this example we will use the BGL adjacency_list class to demonstrate the main ideas in the 
BGL interface. The adjacency_list class provides a generalized version of the classic "adjacency list" 
data structure. The adjacency_list is a template class with six template parameters, though here we only fill 
in the first three parameters and use the defaults for the remaining three. The first two template arguments (
vecS, vecS) determine the data structure used to represent the out-edges for each vertex in the graph and 
the data structure used to represent the graph's vertex set (see section Choosing the Edgelist and VertexList 
for information about the tradeoffs of the different data structures). The third argument, bidirectionalS, 
selects a directed graph that provides access to both out and in-edges. The other options for the third 
argument are directedS which selects a directed graph with only out-edges, and undirectedS which selects 
an undirected graph. 
 
Once we have the graph type selected, we can create the graph in Figure 2 by declaring a graph object 
and filling in edges using the add_edge() function of the MutableGraph interface (which adjacency_list implements).
We use the array of pairs edge_array merely as a convenient way to explicitly create the edges for this example.*/ 
 
 
 
 
    // create a typedef for the Graph type
    typedef adjacency_list<vecS, vecS, bidirectionalS> Graph;
 
    // Make convenient labels for the vertices
    enum { A, B, C, D, E, N };
    const int num_vertices = N;
    const char* name = "ABCDE";
 
    // writing out the edges in the graph
    typedef std::pair<int, int> Edge;
    Edge edge_array[] = 
    { Edge(A,B), Edge(A,D), Edge(C,A), Edge(D,C),
      Edge(C,E), Edge(B,D), Edge(D,E),Edge(5,5),Edge(A,5), Edge(C,7), Edge(B,7), Edge(D,8),Edge(5,8),Edge(9,5) ,Edge(9,8),Edge(9,8)};
    const int num_edges = sizeof(edge_array)/sizeof(edge_array[0]);
 
    // 
 
	std::cout  << "Version 01.02.03 \n\n";
 
 
    // declare a graph object
    Graph g(num_vertices);
 
 
    // add the edges to the graph object
    for (int i = 0; i < num_edges; ++i)
      add_edge(edge_array[i].first, edge_array[i].second, g);
 
//Accessing the Vertex Set
//Now that we have created a graph, we can use the graph interface to access the graph data in different ways. 
//First we can access all of the vertices in the graph using the vertices() function of the VertexListGraph 
//interface. This function returns a std::pair of vertex iterators (the first iterator points to the "beginning" 
//of the vertices and the second iterator points "past the end"). Dereferencing a vertex iterator gives a 
//vertex object. The type of the vertex iterator is given by the graph_traits class. Note that different 
//graph classes can have different associated vertex iterator types, which is why we need the graph_traits class. 
//Given some graph type, the graph_traits class will provide access to the vertex_iterator type. 
//
//The following example prints out the index for each of the vertices in the graph. All vertex and edge properties, 
//including index, are accessed via property map objects. The property_map class is used to obtain the property map
//type for a specific property (specified by vertex_index_t, one of the BGL predefined properties) and function
//call get(vertex_index, g) returns the actual property map object.
 
 
	typedef property_map<Graph, vertex_index_t>::type IndexMap;
    IndexMap index = get(vertex_index, g);
 
    std::cout << "vertices(g) = ";
    typedef graph_traits<Graph>::vertex_iterator vertex_iter;
    std::pair<vertex_iter, vertex_iter> vp;
    for (vp = vertices(g); vp.first != vp.second; ++vp.first)
      std::cout << index[*vp.first] <<  " ";
    std::cout << std::endl;
 
//Accessing the Edge Set
//The set of edges for a graph can be accessed with the edges() function of the EdgeListGraph interface. 
//Similar to the vertices() function, this returns a pair of iterators, but in this case the iterators 
//are edge iterators. Dereferencing an edge iterator gives an edge object. The source() and target() 
//functions return the two vertices that are connected by the edge. Instead of explicitly creating a std::pair 
//for the iterators, this time we will use the tie() helper function. This handy function can be used to assign 
//the parts of a std::pair into two separate variables, in this case ei and ei_end. This is usually more convenient 
//than creating a std::pair and is our method of choice for the BGL.
 
    std::cout << "edges(g) = ";
    graph_traits<Graph>::edge_iterator ei, ei_end;
    for (tie(ei, ei_end) = edges(g); ei != ei_end; ++ei)
        std::cout << "(" << index[source(*ei, g)] 
                  << "," << index[target(*ei, g)] << ") ";
    std::cout << std::endl;
 
// -----------------
 
//  The Adjacency Structure
//  will encapsulate this in an "exercise vertex" function, and apply it to each vertex in the graph. 
 
 
//    std::for_each(vertices(g).first, vertices(g).second, exercise_vertex<Graph>(g));
 
   std::for_each(vertices(g).first, vertices(g).second,
                     exercise_vertex<Graph>(g));
 
 
	system ("pause");
 
 
    return 0;
 
}

Open in new window

0
Comment
Question by:BdLm
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 4
8 Comments
 
LVL 53

Expert Comment

by:Infinity08
ID: 20333607
Can you indicate which lines in the code the errors refer to ?

If the first error refers to this line :

    void operator()(const Vertex& v) const

then check whether you included the header that contains the definition of Vertex.
0
 
LVL 8

Author Comment

by:BdLm
ID: 20333661
Hi,

the compiler claims line 20   void operator()(const Vertex& v) const,
Do I need a Header File for my template, how should this look like ?

Best

0
 
LVL 53

Expert Comment

by:Infinity08
ID: 20333698
>> Do I need a Header File for my template

You need to #include the header that contains the definition of Vertex.
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 8

Author Comment

by:BdLm
ID: 20333862
I wrote a header file, but things turned to be even more wrong .->
............................................

------ Build started: Project: boost_demo_v01, Configuration: Debug Win32 ------
Compiling...
boost_demo_v01.cpp
c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\template_header.h(8) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
        c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\template_header.h(8) : see reference to class template instantiation 'exercise_vertex<Graph>' being compiled
c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\template_header.h(8) : error C2143: syntax error : missing ',' before '&'
c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\template_header.h(8) : error C2143: syntax error : missing ';' before '}'
c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\boost_demo_v01.cpp(42) : error C2953: 'exercise_vertex' : class template has already been defined
        c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\template_header.h(8) : see declaration of 'exercise_vertex'
c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\boost_demo_v01.cpp(149) : error C2440: '<function-style-cast>' : cannot convert from 'Graph' to 'exercise_vertex'
        The target type has no constructors
c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\boost_demo_v01.cpp(149) : error C3861: 'exercise_vertex': identifier not found
Build log was saved at "file://c:\layout_extraction_software\codes\c++\boost_v01\boost_demo_v01\Debug\BuildLog.htm"
boost_demo_v01 - 6 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

//
//   Header File for the Template
//  filename :    Template_Header.h
//  date      :     22-11-2007
//
 
 
template <class Graph> struct exercise_vertex {   void operator()(const Vertex& v) const  }; 

Open in new window

0
 
LVL 53

Expert Comment

by:Infinity08
ID: 20333908
>> I wrote a header file, but things turned to be even more wrong .->

That's not what I said ...


Where is Vertex defined ?
0
 
LVL 8

Author Comment

by:BdLm
ID: 20334922
Hi,

I did not find the defintion of a vertex, may be somewhere inside the include files,
I found another example which looks like my code trial ....
http://www.boost.org/libs/graph/example/quick_tour.cpp

This one I can compile, the template above I can#t compile ....

Best

http://www.boost.org/libs/graph/example/quick_tour.cpp

Open in new window

0
 
LVL 53

Accepted Solution

by:
Infinity08 earned 250 total points
ID: 20334947
>> I did not find the defintion of a vertex,

Well, if you want to use Vertex, you need to have it defined somewhere.


>> may be somewhere inside the include files,

Can you check ?


>> This one I can compile

Not surprisingly, you have this line in that .cpp file :

  typedef typename graph_traits<Graph>::vertex_descriptor Vertex;

which defines Vertex.
0
 
LVL 8

Author Closing Comment

by:BdLm
ID: 31410536
bast on the advise I found the bug
0

Featured Post

Ready to get started with anonymous questions?

It's easy! Check out this step-by-step guide for asking an anonymous question on Experts Exchange.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

  Included as part of the C++ Standard Template Library (STL) is a collection of generic containers. Each of these containers serves a different purpose and has different pros and cons. It is often difficult to decide which container to use and …
This article will show you some of the more useful Standard Template Library (STL) algorithms through the use of working examples.  You will learn about how these algorithms fit into the STL architecture, how they work with STL containers, and why t…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

626 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question