Как изменить сообщение об ошибке компилятора?
От: Аноним  
Дата: 05.02.04 19:22
Оценка:
Ситуация примерно такая:

существует несколько overloaded функций,создающих объект полиморфного класса. Необходимо изменить сообщение о стандартной ошибке, если нет ни одной подходящйе функции для исходного обьекта этого типа..

например:

class unknown
{
public:
    virtual ~_void() {};
}

class Test1: unknown
{
public:
    virtual ~Test1() {};
}

class Test2: unknown
{
public:
    virtual ~Test2() {};
}

class container
{
public:
    virtual void name()=0;
}

<template class T>
class simple_container: container
{
public:
    virtual void name() {   printf("%s",typeid(T).name());   };
}

class class_container: container
{
    unknown *object;
public:
    class_container(unknown * obj):object(obj) {}
    virtual void name() {   printf("%s",typeid(*object).name());   };
}

#define TC(type) container * cont(type &) {   return new simple_container<type>();   }
#define TCC(type) container * cont(type * data) {   return new class_container(data);   }

TC(int);
TC(float);
TC(char);

TCC(Test1);
TCC(Test2);


если, нарпимер, определить еще тип Test3, насдедник от unknown, то он по вполне понятным причинам не будет подходить под синтакиси существующих функций-конструкторов.
MSVC выдет сообщние: none of 5 overloaded functions....

Как можно именно вот это сообщение и заменить?

P.S. пример не проверялся на работатоспособность..
Re: Как изменить сообщение об ошибке компилятора?
От: folk Россия  
Дата: 06.02.04 03:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ситуация примерно такая:


А>существует несколько overloaded функций,создающих объект полиморфного класса. Необходимо изменить сообщение о стандартной ошибке, если нет ни одной подходящйе функции для исходного обьекта этого типа..


А>например:


А>
А>class unknown
А>{
А>public:
А>    virtual ~_void() {};
А>}

А>class Test1: unknown
А>{
А>public:
А>    virtual ~Test1() {};
А>}

А>class Test2: unknown
А>{
А>public:
А>    virtual ~Test2() {};
А>}

А>class container
А>{
А>public:
А>    virtual void name()=0;
А>}

А><template class T>
А>class simple_container: container
А>{
А>public:
А>    virtual void name() {   printf("%s",typeid(T).name());   };
А>}

А>class class_container: container
А>{
А>    unknown *object;
А>public:
А>    class_container(unknown * obj):object(obj) {}
А>    virtual void name() {   printf("%s",typeid(*object).name());   };
А>}

А>#define TC(type) container * cont(type &) {   return new simple_container<type>();   }
А>#define TCC(type) container * cont(type * data) {   return new class_container(data);   }

А>TC(int);
А>TC(float);
А>TC(char);

А>TCC(Test1);
А>TCC(Test2);

А>


А>если, нарпимер, определить еще тип Test3, насдедник от unknown, то он по вполне понятным причинам не будет подходить под синтакиси существующих функций-конструкторов.

А>MSVC выдет сообщние: none of 5 overloaded functions....

А>Как можно именно вот это сообщение и заменить?


Можно сделать чтобы все остальные типы попадали в нерабочий шаблон, но тогда например short также будет попадать в шаблон:

template <class T> void cont(T const volatile&)
{
    struct NoDef;
    NoDef User_defined_error_message;
}



А>P.S. пример не проверялся на работатоспособность..
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re: Как изменить сообщение об ошибке компилятора?
От: WolfHound  
Дата: 06.02.04 06:13
Оценка: :)
Здравствуйте, <Аноним>, Вы писали:

А>Ситуация примерно такая:


А можно вопрос? Это на каком языке?
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Как изменить сообщение об ошибке компилятора?
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 06.02.04 09:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А может все-таки не ошибки компилятора, а твоей ошибки, которую выводит компилятор?


А>существует несколько overloaded функций,создающих объект полиморфного класса.


В твоем случае это overriden, а не overloaded функции.
Re[2]: Как изменить сообщение компилятора об ошибке?
От: Аноним  
Дата: 06.02.04 10:23
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, <Аноним>, Вы писали:


А>>Ситуация примерно такая:


WH>А можно вопрос? Это на каком языке?


День добрый. Искренне извиняюсь за корявость написаного кода и грамматические ошибки в тексте.. Писалось в послденюю минуту в компьютерном клубе...

Вообще, подразумевалось, что это c++, и код был придуман на ходу, чтобы на примере показать ситуацию, где полезно было бы переопределить стандартное сообщение об ошибке, выдаваемой компилятором.
В похожей ситуации, MSVC 6 пишет:
: error C2665: 'tc' : none of the 5 overloads can convert parameter 1 from type ....


Вариант тов. folk достаточно неплох, в этот шаблон попадают все не заявленые заранее типы, но сразу появляется встречный вопрос, — как в теле этой функции сгенерировать именно сообщение компилятора, например
#error Don't know how to handle this type



ЗЫ. В теме слово "комплилятора" относится к существительному "сообщение", а не "ошибке"
Re[3]: Как изменить сообщение компилятора об ошибке?
От: folk Россия  
Дата: 06.02.04 11:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, WolfHound, Вы писали:


WH>>Здравствуйте, <Аноним>, Вы писали:


А>>>Ситуация примерно такая:


WH>>А можно вопрос? Это на каком языке?


А>День добрый. Искренне извиняюсь за корявость написаного кода и грамматические ошибки в тексте.. Писалось в послденюю минуту в компьютерном клубе...


А>Вообще, подразумевалось, что это c++, и код был придуман на ходу, чтобы на примере показать ситуацию, где полезно было бы переопределить стандартное сообщение об ошибке, выдаваемой компилятором.

А>В похожей ситуации, MSVC 6 пишет:
А>
: error C2665: 'tc' : none of the 5 overloads can convert parameter 1 from type ....


А>Вариант тов. folk достаточно неплох, в этот шаблон попадают все не заявленые заранее типы, но сразу появляется встречный вопрос, — как в теле этой функции сгенерировать именно сообщение компилятора, например

А>
#error Don't know how to handle this type


Мне казалось что я достаточно понятно написал:

template <class T> void cont(T const volatile&)
{
    struct NoDef;
    NoDef Dont_know_how_to_handle_this_type;
}


Думаю приктически любой компилятор выведет в сообщении об ошибке среди прочего 'Dont_know_how_to_handle_this_type'.

А>ЗЫ. В теме слово "комплилятора" относится к существительному "сообщение", а не "ошибке"
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[2]: Как изменить сообщение об ошибке компилятора?
От: folk Россия  
Дата: 06.02.04 11:59
Оценка:
Здравствуйте, Alxndr, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


A>А может все-таки не ошибки компилятора, а твоей ошибки, которую выводит компилятор?



А>>существует несколько overloaded функций,создающих объект полиморфного класса.


A>В твоем случае это overriden, а не overloaded функции.


Не знаю что ты имеешь ввиду, но cont — перегруженная (overloaded) функция.
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[4]: Как изменить сообщение компилятора об ошибке?
От: Аноним  
Дата: 06.02.04 12:30
Оценка:
Здравствуйте, folk, Вы писали:

....
F>Мне казалось что я достаточно понятно написал:

F>
F>template <class T> void cont(T const volatile&)
F>{
F>    struct NoDef;
F>    NoDef Dont_know_how_to_handle_this_type;
F>}
F>


F>Думаю приктически любой компилятор выведет в сообщении об ошибке среди прочего 'Dont_know_how_to_handle_this_type'.



Хм. мой компилятор пытается проверить синтаксис этого кода в любом случае, не задумываясь о том, будет он использован или нет..
Re[3]: Как изменить сообщение об ошибке компилятора?
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 06.02.04 12:31
Оценка:
Здравствуйте, folk, Вы писали:

А>>>существует несколько overloaded функций,создающих объект полиморфного класса.


A>>В твоем случае это overriden, а не overloaded функции.


F>Не знаю что ты имеешь ввиду, но cont — перегруженная (overloaded) функция.


Принимается, перепутал: не на cont смотрел.
Re[5]: Как изменить сообщение компилятора об ошибке?
От: folk Россия  
Дата: 06.02.04 13:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, folk, Вы писали:


А>....

F>>Мне казалось что я достаточно понятно написал:

F>>
F>>template <class T> void cont(T const volatile&)
F>>{
F>>    struct NoDef;
F>>    NoDef Dont_know_how_to_handle_this_type;
F>>}
F>>


F>>Думаю приктически любой компилятор выведет в сообщении об ошибке среди прочего 'Dont_know_how_to_handle_this_type'.



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


Проверка синтаксиса — одно (причем синтаксических ошибок тут нет), истанцирование шаблона — другое. Компилятор не должен инстанцировать шаблон, пока его явно или неявно не попросят об этом.

А например так тоже выделывается?

template <bool C> struct static_assert;
template <> struct static_assert<true> {};

template <class T> void cont(T const volatile&)
{
    static_assert<false> Dont_know_how_to_handle_this_type;
}
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[6]: Как изменить сообщение компилятора об ошибке?
От: Аноним  
Дата: 06.02.04 14:55
Оценка:
Здравствуйте, folk, Вы писали:

.....

F>
F>template <bool C> struct static_assert;
F>template <> struct static_assert<true> {};

F>template <class T> void cont(T const volatile&)
F>{
F>    static_assert<false> Dont_know_how_to_handle_this_type;
F>}
F>


Так работает. но появляется другая проблема..
чуть-чуть изменим исходный код и пправим ошибки..

class unknown
{
public:
    virtual ~_void() {};
};

class Test1: unknown
{
};

class Test2: unknown
{
};

class container
{
public:
    virtual void name()=0;
};

<template class T>
class simple_container: container
{
public:
    virtual void name() {   printf("%s",typeid(T).name());   };
};

class class_container: container
{
    unknown *object;
public:
    class_container(unknown * obj):object(obj) {}
    virtual void name() {   printf("%s",typeid(*object).name());   };
};

#define TC(type) container * cont(type &) {   return new simple_container<type>();   }
#define TCC(type) container * cont(type * data) {   return new class_container(data);   }

TC(int);
TC(float);
TC(char);

TCC(unknown);


int main()
{
    int i=5;
    float f=5.3;
    Test1 *u=new Test1;
    
    container * container1=TC(i); //simple_container<int>
    container * container2=TC(f); //simple_container<float>
    container * container3=TC(u); //class_container
}


так работать система будет, но стоит описать еще
template <class T> container * cont(T const volatile&)
{
..
}

и эта реализация cont становится для компилятора более приемлимой, чем

container * cont(unknown * data)
{
}


и для обработки классов Test1 и Test2 придется и для них делать экземпляры cont, не требующие приведения к предку.
Re[7]: Как изменить сообщение компилятора об ошибке?
От: folk Россия  
Дата: 07.02.04 03:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, folk, Вы писали:


А>.....


F>>
F>>template <bool C> struct static_assert;
F>>template <> struct static_assert<true> {};

F>>template <class T> void cont(T const volatile&)
F>>{
F>>    static_assert<false> Dont_know_how_to_handle_this_type;
F>>}
F>>


А>Так работает. но появляется другая проблема..

А>чуть-чуть изменим исходный код и пправим ошибки..

Не, ошибки ты так и не исправил , компилироваться приведенный ниже код не будет

А>
А>class unknown
А>{
А>public:
А>    virtual ~_void() {};
А>};

А>class Test1: unknown
А>{
А>};

А>class Test2: unknown
А>{
А>};

А>class container
А>{
А>public:
А>    virtual void name()=0;
А>};

А><template class T>
А>class simple_container: container
А>{
А>public:
А>    virtual void name() {   printf("%s",typeid(T).name());   };
А>};

А>class class_container: container
А>{
А>    unknown *object;
А>public:
А>    class_container(unknown * obj):object(obj) {}
А>    virtual void name() {   printf("%s",typeid(*object).name());   };
А>};

А>#define TC(type) container * cont(type &) {   return new simple_container<type>();   }
А>#define TCC(type) container * cont(type * data) {   return new class_container(data);   }

А>TC(int);
А>TC(float);
А>TC(char);

А>TCC(unknown);


А>int main()
А>{
А>    int i=5;
А>    float f=5.3;
А>    Test1 *u=new Test1;
    
А>    container * container1=TC(i); //simple_container<int>
А>    container * container2=TC(f); //simple_container<float>
А>    container * container3=TC(u); //class_container
А>}
А>


А>так работать система будет, но стоит описать еще

А>
А>template <class T> container * cont(T const volatile&)
А>{
А>..
А>}
А>

А>и эта реализация cont становится для компилятора более приемлимой, чем

А>
А>container * cont(unknown * data)
А>{
А>}
А>


А>и для обработки классов Test1 и Test2 придется и для них делать экземпляры cont, не требующие приведения к предку.


Ну разумеется, просто в предыдущих постах ты для каждого потомка unknown перегружал cont.

Да плюнь вообще на эту идею, ничего хорошего в ней нет, не надо усложнять простое. Родное сообщение компилятора о том что ни одна из перегрузок не подходит верно описывает ситуацию.
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.