Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите скомпилировать / 23 сообщений из 23, страница 1 из 1
03.07.2007, 11:35
    #34634298
odmit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
Здравствуйте!

Имеются исходники некой библиотеки. Компилирую в Visual Studio 2005.
При компиляции - ошибки:

Код: plaintext
1.
Error 2 error C2664: 'bool (const CEnglishName &,const char *)' : cannot convert parameter 2
from 'const CEnglishName' to 'const char *' c:\program files\microsoft visual studio 8\vc\include\xutility 292

Подскажите, с какими параметрами компилировать?
...
Рейтинг: 0 / 0
03.07.2007, 11:39
    #34634319
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
Ваш класс CEnglishName не поддреживает преобразование в const char *, аргумент которого вы указали во втором параметре функции. Возможно просто ошиблись аргументами.
...
Рейтинг: 0 / 0
03.07.2007, 11:42
    #34634340
odmit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
AkhВаш класс CEnglishName не поддреживает преобразование в const char *, аргумент которого вы указали во втором параметре функции. Возможно просто ошиблись аргументами.

Эта библиотека не моя. Объявлено, что компилируется в Линуксе и Windows.
Эти исходники для Линукса (скорее всего они же и для Windows). Но из-за
скудности познаний в C++ скомпилировать у меня не получилось.
...
Рейтинг: 0 / 0
03.07.2007, 11:49
    #34634373
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
Тогда надо интерфейс класса CEnglishName и объявление функции, которая вызывается на 292-й строчки файла xutility.
...
Рейтинг: 0 / 0
03.07.2007, 12:01
    #34634433
odmit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
AkhТогда надо интерфейс класса CEnglishName и объявление функции, которая вызывается на 292-й строчки файла xutility.

В файле xutility классы шаблонов для VS:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
template<class _Pr, class _Ty1, class _Ty2> inline
	bool __CLRCALL_OR_CDECL _Debug_lt_pred(_Pr _Pred, const _Ty1& _Left, const _Ty2& _Right,
		const wchar_t *_Where, unsigned int _Line)
	{	// test if _Pred(_Left, _Right) and _Pred is strict weak ordering
	if (!_Pred(_Left, _Right))
		return (false);
	else if (_Pred(_Right, _Left))
		_DEBUG_ERROR2("invalid operator<", _Where, _Line);
	return (true);
	}

Конкретное место ошибки в коде найти маловероятно.
И подобных ошибок несколько. Может есть переключатель для приведения типов?
...
Рейтинг: 0 / 0
03.07.2007, 12:04
    #34634448
odmit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class CEnglishName {
public:

	char name[MaxNameSize];

	bool operator==(const CEnglishName& X) const
	{ return strcmp (name, X.name) ==  0 ;};

	bool operator<(const CEnglishName& X) const
	{ return strcmp (name, X.name) <  0 ;};

};
...
Рейтинг: 0 / 0
03.07.2007, 12:08
    #34634468
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
Нет и быть не могет, приведения типов в шаблонах не работают придется ручками найти все обращения и поправить, скорее всего сравнивается строка в кавычках с CEnglishName
...
Рейтинг: 0 / 0
03.07.2007, 12:11
    #34634482
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
odmit...
Конкретное место ошибки в коде найти маловероятно.
И подобных ошибок несколько. Может есть переключатель для приведения типов?

По этому коду можно только гадать на кофейной гуще.

Возможно используются директивы препроцессора для условной компиляции, но это тоже можно понять только по исходному коду.
...
Рейтинг: 0 / 0
03.07.2007, 12:16
    #34634509
odmit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
Спасибо всем ответившим. Буду думать.
...
Рейтинг: 0 / 0
03.07.2007, 12:27
    #34634559
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
blindedприведения типов в шаблонах не работают

В смысле?
...
Рейтинг: 0 / 0
03.07.2007, 13:07
    #34634718
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
Akh blindedприведения типов в шаблонах не работают

В смысле?
При инстанциации шаблона неявное пробразование типа не работает...
...
Рейтинг: 0 / 0
03.07.2007, 13:11
    #34634741
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
blinded Akh blindedприведения типов в шаблонах не работают

В смысле?
При инстанциации шаблона неявное пробразование типа не работает...

Имеется ввиду, что template<argA> и termplate<argB> не имеют преобразования, даже если argA имеет преобразование в argB? Тогда, да.

По разному можно это тракторвать, так что я не пойму, про что речь. ;)
...
Рейтинг: 0 / 0
03.07.2007, 13:38
    #34634870
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
Не имеется ввиду как раз случай автора топика. Даже ежели у CEnglishName есть преобразование к const char*, сравнить их с помощью приведеннгого шаблона нельзя. Ежели только не указать явно не квалифицировать параметры шаблона
...
Рейтинг: 0 / 0
03.07.2007, 15:37
    #34635362
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
blindedНе имеется ввиду как раз случай автора топика. Даже ежели у CEnglishName есть преобразование к const char*, сравнить их с помощью приведеннгого шаблона нельзя. Ежели только не указать явно не квалифицировать параметры шаблона

Борис, ты не прав (с)...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
class S {
        string s;
    public:
        S(string const &s_) :
        s(s_) {};

        operator string() {
            return s;
        }
};

class Outer {
    public:
        void operator()(string s) {
            cout << s;
        }
};

template <class U, class T>
void func(U &u, T arg) {
    u(arg);
};


int main() {
    Outer outer;
    func(outer, S("test string\n"));

    return  0 ;
}

...
Рейтинг: 0 / 0
03.07.2007, 15:39
    #34635368
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
Имхо, при инстанциации правила обработки синтаксиса шаблона становятся аналогчными обычной функции.
...
Рейтинг: 0 / 0
03.07.2007, 16:30
    #34635589
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
AkhИмхо, при инстанциации правила обработки синтаксиса шаблона становятся аналогчными обычной функции.
Ничего не говорю - уел
Но вот только не поможет преобразование типов автору. Ты внимательно посмотри на предикат которым сравнивают:
ежели _Ty1 и _Ty2 не совпадют, то стандартным less пользоваться нельзя(не сможет компилятор правильно инстациировать его); кроме этого при несовпадении типов опреанд должен будет иметь два метода
bool operator()(const _Ty1&, const _Ty2&);
bool operator()(const _Ty2&, const _Ty1&);
и в качестве операнда не получится использовать указатель на функцию - только функциональный объект. В общем код - большая Ж
...
Рейтинг: 0 / 0
03.07.2007, 17:10
    #34635772
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
blinded AkhИмхо, при инстанциации правила обработки синтаксиса шаблона становятся аналогчными обычной функции.
Ничего не говорю - уел
Но вот только не поможет преобразование типов автору. Ты внимательно посмотри на предикат которым сравнивают:
ежели _Ty1 и _Ty2 не совпадют, то стандартным less пользоваться нельзя(не сможет компилятор правильно инстациировать его); кроме этого при несовпадении типов опреанд должен будет иметь два метода
bool operator()(const _Ty1&, const _Ty2&);
bool operator()(const _Ty2&, const _Ty1&);
и в качестве операнда не получится использовать указатель на функцию - только функциональный объект. В общем код - большая Ж

Ну, во первых, какой там используется предикат, это еще загадка. Но если он не шаблонный, то никаких вопросов не возникает. По всей видимости приведенный оператор < показал вам, что там возможно объект функции less<>. Респект! Я так далеко не дошел. Поэтому и не предполагал, что предикат шаблонный.

Да, похоже на то, что компилятор не сможет выбрать по какому типу ему инстанцировать less и без явного указания здесь дело не обойдется. Но даже, если фамилию привести к чару со звездочкой, то сравнение указателей ни к чему хорошему не приведет. Чар звездочку к фамилии можно привести через конструктор с одним параметром, поэтому достаточно указать к какому типу инстанцировать предикат. Только вот, теперь загадка: к _Ty1 или Ty2?

Если же сдалать _Ty1==_Ty2=_Ty, то все проблемы изчезают, но тогда в коде всегда надо будет точно определять типы передаваемых параметров. Ну, например, явно указывать перобразование через конструктор. Мне кажется это наиболее предпочтительный вариант (если исходники позволяют), т.к. в данном случае не возникнет ни каких неожиданных преобразований типов.

Преобразование к чар звездочка тут вводить уже мало того что не надо, а бессмысленно и опасно.
...
Рейтинг: 0 / 0
03.07.2007, 17:36
    #34635881
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
Преобразовать к const char* можно, для этого надо less специализировать. Но лучше явно конечно привести к CEnglishName
...
Рейтинг: 0 / 0
03.07.2007, 17:40
    #34635898
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
blindedПреобразовать к const char* можно, для этого надо less специализировать. Но лучше явно конечно привести к CEnglishName

Я не спорю, что можно. Но это бессмысленно, так как будут сравниваться указатели, а необходимо сравнение строк по указателям.
...
Рейтинг: 0 / 0
03.07.2007, 17:52
    #34635945
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
Ты не понял
Код: plaintext
1.
2.
3.
4.
5.
template <>
class less<const char*>
{
  bool operator()(const char* l, const char* r) { return strcmp(l, r) <  0 ; }
}
...
Рейтинг: 0 / 0
03.07.2007, 17:56
    #34635957
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
blindedТы не понял
Код: plaintext
1.
2.
3.
4.
5.
template <>
class less<const char*>
{
  bool operator()(const char* l, const char* r) { return strcmp(l, r) <  0 ; }
}


???

Это дублирование кода. В объекте уже введен оператор меньше.
...
Рейтинг: 0 / 0
03.07.2007, 18:09
    #34636002
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
Но мы же хотели сравнивать указатели....
...
Рейтинг: 0 / 0
04.07.2007, 09:45
    #34636815
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите скомпилировать
blindedНо мы же хотели сравнивать указатели....

Я не хотел. Ты правельно написал, что код большая Ж. Поэтому я привел вариант с поддрежкой типизации. Шаблон функции будет строиться по классу, объекты которого должны сравниваться. Поэтому типы аргументов надо объединить в один. И, следовательно для этого должны вводяться конструкторы с одним параметром для приведения чара со звездочкой к фамилии. Раз в коде программы используется сравнение разных типов аргументов, следовательно идеалогия построения должна позволять их приводить друг к другу. Есстесственно, сравниваться должны именно объекты, для которых по смыслу это сравнение и подходит. Поэтому это и есть фамилия. А чар со звездочкой - это что угодно. И мало того, что он не носит информации о том, как надо стравнивать фамилии, он тем более более общий тип. Тем более, по приведенному коду, ни что не мешает сделать сравнение фамилий по этому варианту. Мы будем иметь инкапсуляцию функциональности объекта в нем самом. Что может быть еще более оптимистичней? ;)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите скомпилировать / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]