LINUX.ORG.RU

GCC 4.2. И что теперь?


0

0

Вот класс графа, производный от IGraph:

template <template<typename> class TRepresentation = AdjacencyList> 

class Graph : public IGraph<Edge, TRepresentation>
    {
     public:
		     	    	      
         Graph( const int _vertexCount,
                const GraphType _graphType = GraphType_NonDirected ) :   
	    IGraph( _vertexCount, _graphType ) {}    			                      			     
    };

А вот ошибка GCC: 

"IGraph не является членом Graph". 


И что теперь? (с) Страуструп. 

Теперь что, нельзя инициализировать члены базового класса конструктором базового класса? А что мне делать :(

Я работаю под линуксом второй день. До этого работал исключительно в винде. Но ей я так понимаю точно капец :D, поэтому решил работать в Mandriva. Установил Eclipse, и... вот! GCC какой-то не такой. Вчера он мне заявил, что hash_map находится не в sdtext, а в целом __gnu_cxx. С этой проблемой справиться труда не составило. А вот с вышеописанной проблемой возникают трудности. 

anonymous

Кстати, совсем забыл: G++ что, typedef-ы, определённые в базовом классе , если к ним обращаться из производного тоже не видит...? Мда...

anonymous
()
Ответ на: комментарий от max_posedon

template <typename TEdge,
          template<typename> class TRepresentation>
		               
class IGraph
    {
     public:
		     
         typedef TRepresentation<TEdge> Representation;		     
	 typedef typename Representation :: AdjIterator AdjIterator;
	 typedef TEdge* EdgePointer;
		     
		     
	 IGraph( const int _vertexCount,
		 const GraphType _graphType ) :
            vertexCount( _vertexCount ),	
	    edgeCount( Nothing ),
	    graphType( _graphType ) 	    
	     {
	      rep = new Representation( vertexCount );
	     }


	     /* Истина, если граф - направленный */ 
	 bool Directed() const
            { return graphType == GraphType_Directed; } 
                 

	     /* Сколько вершин содержит граф? */
	 int VertexCount() const { return vertexCount; } 
	  		      
	     /* Сколько рёбер содержит граф? */ 
	 int EdgeCount() const { return edgeCount; }

	  		
	     /**/ 
	 void AddEdge( const EdgePointer edge )
	     {
	      VertexId begin = edge->Begin();   
	      VertexId end = edge->End(); 

	      if ( !Adjacency( begin, end ) )		 			 
	          {
	  	   rep->AddEdge( edge );

	  	   if ( graphType == GraphType_NonDirected )
	  	       { 					
	  		rep->AddReverseEdge( edge );
	  	       }
	  	 				  
	  	   ++edgeCount;
	  	  }
	     }

	
	     /**/ 
	 void AddEdge( const VertexId begin, const VertexId end )
	     {
	      AddEdge( new TEdge( begin, end ) );	
	     }

	            	      
	     /**/
	 void RemoveEdge( const EdgePointer edge )
	     { 
	      RemoveEdge( edge->Begin(), edge->End() );		         
	     }

	        	            
	     /**/
	 void RemoveEdge( const VertexId begin, const VertexId end )
	     { 
	      if ( Adjacency( begin, end ) )
	          {
	  	   rep->RemoveEdge( begin, end );

	  	   if ( graphType == GraphType_NonDirected ) 
	  	       {
	  		rep->RemoveEdge( end, begin ); 
	  	       }
	  				 		      			      
	  	   --edgeCount;
	  	  }  	
	     }	


	     /* Есть две вершины. Вопрос: они смежные? */ 
	 bool Adjacency( const VertexId begin, const VertexId end )
	     {
	      return rep->Adjacency( begin, end );
	     }


	     /**/
	 AdjIterator IteratorForMe( const VertexId vertex ) 
	     {
	      return rep->IteratorForMe( vertex );		 
	     }


	 virtual ~IGraph() { delete rep; }
						
     protected:
	  	
	 int vertexCount;
	 int edgeCount;

         GraphType graphType;
	  	
	 Representation* rep; 
    };



	/**/ 
template <template<typename> class TRepresentation = AdjacencyList> 

class Graph : public IGraph<Edge, TRepresentation>
	{
	 public:
		     	    	      
		Graph( const int _vertexCount,
			   const GraphType _graphType = GraphType_NonDirected ) :			   
		    IGraph<TEdge, TRepresentation>( _vertexCount, _graphType ) {}    			     	     		           			      		 		      	
	};



	/**/
template <typename TWeight, 
	      template<typename> class TRepresentation = WeightAdjacencyList>

class WeightGraph : public IGraph<WeightEdge<TWeight>, TRepresentation> 
    {
     public:
		    
	WeightGraph( const  int _vertexCount,
		     const GraphType _graphType = GraphType_NonDirected ) :				  	      
			IGraph( _vertexCount, _graphType ) {}       	
	  };


	} /* namespace DataStructure */ 

#endif

anonymous
()
Ответ на: комментарий от max_posedon

// 2. IGraph<Edge, TRepresentation>( _vertexCount, _graphType )

Нифига. Сейчас он мне добавил ещё 3 ошибки. Согласно предположениям ув. компилятора, первый аргумент шаблона стал некорректен, нет определения TEdge в этой области видимости и что-то очень длинное и малопонятное.

P.S.: VS не выдавал ни то что ни одной ошибки, даже ворнингов не выдавал. Вспоминаю GCC 3.x, с которым работал под виндой - удивляюсь. Ведь GCC был далеко не последней причниой перехода на линукс... А теперь... 28 ошибок в пртестированном и компилируемом др. компиляторами коде...

anonymous
()
Ответ на: комментарий от anonymous

   // Ошибки в студию :)

До исправления строчки: IGraph( _vertexCount, _graphType ) на IGraph<Edge, TRepresentation>( _vertexCount, _graphType ) было:

Multiple markers at this line
    - ошибка: нет подходящей функции для вызова 
    ‘DataStructure::IGraph<GraphImpl::Edge,       GraphImpl::AdjacencyList>::IGraph()’
    - ошибка: в классе ‘DataStructure::Graph<TRepresentation>’ не имеет поля с именем ‘IGraph’ 

После исправления, предложенного Максом_Посейдоном, стало:

.Multiple markers at this line
    - ошибка: некорректный аргумент шаблона 1
    - ошибка: нет подходящей функции для вызова 
    ‘DataStructure::IGraph<GraphImpl::Edge,    
     GraphImpl::AdjacencyList>::IGraph()’
    - ошибка: нет декларации ‘TEdge’ в этой области видимости

Остальные 24 показывать? Покажу, не вопрос. Только надо ли? Ведь тогда придётся показывать остальные файлы. Может сразу все 25000 строчек выложить? :D. Ребята, вы мне, студенту немощному, скажите: что GCC не нравится когда я инициализирую члены базового класса через конструктор базового класса. Код, который для этого необходим я привёл. Ещё раз: рпи компиляции двумя др. компиляторами всё было нормально. Все мои строчки компилировались. А вот G++, который я всегда считал образцом для подражания, при переходе в linux, сказал, что хуй, не буду компилировать. А почему?   

anonymous
()
Ответ на: комментарий от anonymous

> После исправления, предложенного Максом_Посейдоном

это правильное исправление.

> рпи компиляции двумя др. компиляторами всё было нормально.

среди них был intel compiler?

стандарт ты хоть раз читал, или только смотрел, что на твоем конкретном компиляторе это работает?

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

> А почему?

gcc не из простых компиляторов, его сообщения об ошибках меня регулярно в ступор вводят. Я на тачке всегда держу 3.4.6 и какой-нить из последних компилеров. И если что-то не так то компилю старым чтобы убедиться что это ошибка у меня не из-за того что они что-то там поменяли. А меняют они часто, о чём и пишут в release notes. Я рекомендую тебе поставить gcc той же версии что и у тебя была под виндой.

А вообще, в gcc и ошибки бывают :(. Сам как-то в молодости схватил кучу багов компилера(и тоже в icc всё собиралось и работало, но gcc херню нёс и или не собирал или всё глючило дико) теперь вот всегда кажется что проблема не у меня. Однако за последний год что на сях пишу даже в самых страшных случаях виноват мой код был(для примера смотри сегодняшний тред про assert:)).

Мой совет: не унывать и читать к нему доки. А ещё учиться, учиться и учиться ибо писать кросс-платформенный код да ещё и для разных компилеров это очень трудно, один endianess чего стоит при битовых операциях.

PS В cpp не секу, поэтому не помогу.

anonymous
()
Ответ на: комментарий от dilmah

> это правильное исправление.

Да я в общем и не отрицаю.

> стандарт ты хоть раз читал, или только смотрел, что на твоем > конкретном компиляторе это работает?

Нет, не читал. Хотя надо бы. Только у меня сейчас конкретная проблема, которую я не могу решить. И не отрицаю, что исправление правильное. Я просто констатирую факт, что число ошибок только увеличилось.

> среди них был intel compiler?

Нет. Только cl и Comeau.

Т.е. я правильно понял, что G++ требует чтобы указывались параметры шаблона при вызове коструктора базового класса? Ответь просто: да или нет.

anonymous
()
Ответ на: комментарий от anonymous

>> А ещё учиться, учиться и учиться

+1

Вроде учусь. Только-только начал работать с open-source технологиями. Привыкаю постепенно. Уже два дня :D. Но в общем нравится. Атмосфера у этих технологий какая-то особенная.

anonymous
()
Ответ на: комментарий от anonymous

> Т.е. я правильно понял, что G++ требует чтобы указывались параметры
> шаблона при вызове коструктора базового класса?
> Ответь просто: да или нет.

имхо этого требует стандарт.

В записи

        Graph( const int _vertexCount,
                const GraphType _graphType = GraphType_NonDirected ) :   
	    IGraph( _vertexCount, _graphType ) {} 

на месте IGraph должен стоять mem-initializer-id.

mem-initializer-id:
	::opt nested-name-specifieropt class-name
	identifier

Unless the mem-initializer-id names a nonstatic data member of the constructor's class or a direct or virtual base of that class, the mem-initializer is ill-formed.

Но IGraph это не базовый класс для Graph<...>.  IGraph это некий
template-id.  Нигде в стандарте я не вижу, что компилятор должен
догадаться, какие параметры для него нужно подставить.

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

ну показывай все :). Будем думать.

anonymous
()
Ответ на: комментарий от dilmah

>> Но IGraph это не базовый класс для Graph<...>.

Не ради флейма, но...

IGraph - да, не базовый.

А вот IGraph<Edge, TRepresentation> - базовый. И аргументы шаблона, как ты сам мог заметить, не трудно вывести уже потому, что вариант базового класса однозначно определен. Имя ему: IGraph<Edge, TRepresentation>. Что официально задекларировано вот в этой строчке:

class Graph : public IGraph<Edge, TRepresentation>

Хотя, если это не соответствует стандарту, то я согласен - этого быть не должно. Тут я не спорю, ибо студент-первокурсник, рановато спорить на тему стандарта. Но вот то, что компилятор имел возможность однозначно определить базовый класс, мне кажется верным.

anonymous
()
Ответ на: комментарий от dilmah

> mem-initializer-id.

> mem-initializer-id: >::opt nested-name-specifieropt class-name > identifier

Это наверно понятно всем, кроме меня. Можно вкратце, если не затруднит :)

anonymous
()
Ответ на: комментарий от anonymous

template <typename T1, typename T2>
class A
{
public:
	A(int _a, int _b):a(_a), b(_b) {};
	int a;
	int b;
};

template <typename T1, typename T2>
class B:public A<T1, T2>
{
public:
	B(int _a, int _b, int _c):A<T1, T2>(_a, _b), c(_c) {};
	int c;
};

int main ()
{
	A<int, double> a(1, 2);
	B<int, double> b(1, 2, 3);
	return 1;
}

anonymous
()
Ответ на: комментарий от anonymous

Ну в общем да. Только

template <typename T1, typename T2>

class B:public A<T1, T2> { public: B(int _a, int _b, int _c):A<T1, T2>(_a, _b), c(_c) {}; int c; };

T1 - это конкретный класс. То есть наследование происходит не от IGraph<T1, T2>, где T1 - шаблонный параметр, а от IGraph<Конкретный тип ребра, T2>. Т.е. первый аргумент базового класса - это определённый тип.

anonymous
()
Ответ на: комментарий от anonymous

>На что только быдлокодеры не пойдут, чтобы хаскель не учить!

Хорошо. Где ты увидел быдлокод? Это учебная библиотека графов, не подходящая для промышленного использования. Нужна только для того, что подготовить доклад в рамках курсовой о графах, их использовании в науке и т.д.

А где ты увидел, что я наезжаю на ФП? Может ты просто хамло дешёвое, а не профессионал?

anonymous
()
Ответ на: комментарий от anonymous

Так?

typedef char T3;

template <typename T1, typename T2>
class B:public A<T3, T2>
{
public:
	B(int _a, int _b, int _c):A<T3, T2>(_a, _b), c(_c) {};
	int c;
};

anonymous
()
Ответ на: комментарий от anonymous

Ты для начала объясни, зачем писать графы на плюсах, если есть более подходящие для этого языки.

anonymous
()
Ответ на: комментарий от anonymous

Ага. Именно так.

У тебя работает? Последний приведенный код. У меня точно также, но компилятор стоит на своём. Просто если у тебя работает, значит ошибка не здесь, и буду исправлять оставшиеся 12 ошибок. А эта в таком случае просто зависит от какой-то др. В любом случае - спасибо ребята. А то долго бы рылся в GCC-мануале, узнавая о правилах пердачи параметров в базовый класс.

anonymous
()
Ответ на: комментарий от anonymous

> Ты для начала объясни, зачем писать графы на плюсах, если есть более > подходящие для этого языки.

У меня нет опыта программирования. Поэтому, пока я не достиг просветления, следую советам преподавателей университета. Они, на своих лекциях, упорно говорили о том, что понимать надо парадигмы, а языки программирования использовать отталкиваясь от того, какая парадигма, или их комбинация, подходит для решения конкретной задачи проектирования. С++ полностью удовлетворяет мои потребности. Например такие, как условие, чтобы с любым типом графа алгоритм мог работать так, чтобы не знать об этом типе. Т.е я должен был предоставить алгоритмам унифицированный интерфейс. Проще всего это сделать, обеспечив механизм итераторов для доступа к смежным вершинам. И предоставив этот интерфейс для каждого из типов представлений. Кроме того, среди условий значилось, что алгоритмы должны работать также независимо от типа представления графа: будь то список или матрица смежности. С++ предоставляет все необходимые мне средства. К тому же - он чрезвыйчайно эффективен. Что, опять же важно, ибо по условию курсовой, я должен представить алгоритмы, работающие с миллионами вершин. Таким образом, возникает вопрос: зачем мне что-то другое, если 1) моё время строго ограничено; 2) С++ удовлетворяет всем перечисленным условиям;

А теперь ты расскажи какое я быдло, расскажи. Ты, наверно, уже всем тут надоел.

anonymous
()
Ответ на: комментарий от anonymous

>> У меня компилируется gcc 4.2 (mingw32). Даже с -Wall молчит.

Всё понял. Спасибо за информацию. Буду всю ночь отлаживать.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.