powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите скомпилировать
23 сообщений из 23, страница 1 из 1
Помогите скомпилировать
    #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
Помогите скомпилировать
    #34634319
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваш класс CEnglishName не поддреживает преобразование в const char *, аргумент которого вы указали во втором параметре функции. Возможно просто ошиблись аргументами.
...
Рейтинг: 0 / 0
Помогите скомпилировать
    #34634340
odmit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkhВаш класс CEnglishName не поддреживает преобразование в const char *, аргумент которого вы указали во втором параметре функции. Возможно просто ошиблись аргументами.

Эта библиотека не моя. Объявлено, что компилируется в Линуксе и Windows.
Эти исходники для Линукса (скорее всего они же и для Windows). Но из-за
скудности познаний в C++ скомпилировать у меня не получилось.
...
Рейтинг: 0 / 0
Помогите скомпилировать
    #34634373
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда надо интерфейс класса CEnglishName и объявление функции, которая вызывается на 292-й строчки файла xutility.
...
Рейтинг: 0 / 0
Помогите скомпилировать
    #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
Помогите скомпилировать
    #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
Помогите скомпилировать
    #34634468
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет и быть не могет, приведения типов в шаблонах не работают придется ручками найти все обращения и поправить, скорее всего сравнивается строка в кавычках с CEnglishName
...
Рейтинг: 0 / 0
Помогите скомпилировать
    #34634482
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
odmit...
Конкретное место ошибки в коде найти маловероятно.
И подобных ошибок несколько. Может есть переключатель для приведения типов?

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

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

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

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

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

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

По разному можно это тракторвать, так что я не пойму, про что речь. ;)
...
Рейтинг: 0 / 0
Помогите скомпилировать
    #34634870
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не имеется ввиду как раз случай автора топика. Даже ежели у CEnglishName есть преобразование к const char*, сравнить их с помощью приведеннгого шаблона нельзя. Ежели только не указать явно не квалифицировать параметры шаблона
...
Рейтинг: 0 / 0
Помогите скомпилировать
    #34635362
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
Помогите скомпилировать
    #34635368
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имхо, при инстанциации правила обработки синтаксиса шаблона становятся аналогчными обычной функции.
...
Рейтинг: 0 / 0
Помогите скомпилировать
    #34635589
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhИмхо, при инстанциации правила обработки синтаксиса шаблона становятся аналогчными обычной функции.
Ничего не говорю - уел
Но вот только не поможет преобразование типов автору. Ты внимательно посмотри на предикат которым сравнивают:
ежели _Ty1 и _Ty2 не совпадют, то стандартным less пользоваться нельзя(не сможет компилятор правильно инстациировать его); кроме этого при несовпадении типов опреанд должен будет иметь два метода
bool operator()(const _Ty1&, const _Ty2&);
bool operator()(const _Ty2&, const _Ty1&);
и в качестве операнда не получится использовать указатель на функцию - только функциональный объект. В общем код - большая Ж
...
Рейтинг: 0 / 0
Помогите скомпилировать
    #34635772
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
Помогите скомпилировать
    #34635881
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Преобразовать к const char* можно, для этого надо less специализировать. Но лучше явно конечно привести к CEnglishName
...
Рейтинг: 0 / 0
Помогите скомпилировать
    #34635898
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedПреобразовать к const char* можно, для этого надо less специализировать. Но лучше явно конечно привести к CEnglishName

Я не спорю, что можно. Но это бессмысленно, так как будут сравниваться указатели, а необходимо сравнение строк по указателям.
...
Рейтинг: 0 / 0
Помогите скомпилировать
    #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
Помогите скомпилировать
    #34635957
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
Помогите скомпилировать
    #34636002
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но мы же хотели сравнивать указатели....
...
Рейтинг: 0 / 0
Помогите скомпилировать
    #34636815
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedНо мы же хотели сравнивать указатели....

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


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