LINUX.ORG.RU

Поглумиться над cl.exe


0

0

C:\temp>cl /v
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.


----------- a.cpp ----------------

#include <iostream>

using namespace std;

class A{
public:
	void a(){
		cout << "A" << endl;
	}
	virtual void b(){
		a();
	}

};

class B{

};

class B : public A{
public:
	void a(){
		cout << "B" << endl;
	}

	void b(){
		a();
	}

	virtual void b(){
		a();
	}
};

int main(int argc, char ** argv){
	A * a = new B();
	a->b();
	return 0;
}


--------- / --------------------

C:\temp> cl a.cpp

a.cpp(20) : error C2011: 'B' : 'class' type redefinition
        a.cpp(16) : see declaration of 'B'
a.cpp(36) : error C2440: 'initializing' : cannot convert from 'B *' to 'A *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
★★★★★

что не так? Первая ошибка вполне внятная, такая же как и у g++, а дальше просто кривое восстановление после ошибок, в gcc такого навалом

phoenix ★★★★
()

И что не так?

Удали:

class B{

};

Noord
()

Опять надуделсо?!!

сабж

anonymous
()

Баян. В С++ запрещена перегрузка методов базового класса. Называй void b() (который не virtual) по другому.

Esh ★★★★
()

> Поглумиться над cl.exe

Думал, что это common lisp под винду

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

Ну вообще то тут дважды объявлена void b(); а компилятор бубнит что-то вообще не по теме.

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

Для сравнения g++ говорит вот что:

$ g++ a.cpp a.cpp:20: error: redefinition of &#8216;class B&#8217; a.cpp:16: error: previous definition of &#8216;class B&#8217; a.cpp: In function &#8216;int main(int, char**)&#8217;: a.cpp:36: error: cannot convert &#8216;B*&#8217; to &#8216;A*&#8217; in initialization

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

ну и? про дважды объявленную void b() gcc тебе тоже ничего не сказал.

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

Он бубнит как раз по теме, потому что вначале находит второе объявление class B. То, что написано в этом втором объявлении class B не интересует оба компилятора. Поменяй порядок объявления классов B и сообщения о твоих ошибках станут белыми и шелковистыми :-)

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

> Первая ошибка вполне внятная, такая же как и у g++, а дальше просто кривое восстановление после ошибок, в gcc такого навалом.

Второе сообщение cl.exe об ошибке тоже вполне внятное, если учесть первое его сообщение. Что так удивило автора темы мне тоже не понятно.

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