Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Портируем код из VC6.0 в VS 2005


Автор: alexsid1982 19.3.2008, 15:52
Товарищи я в шоке. После многих попыток понять в чем я сдаюсь.

имеем класс
Код

template<class N, class T>
class CStaticTable : public CBaseRecord 
{
protected:
T        table[N::eAmount];
// ...
public: 
// ...
bool    Sort( const TSort sortp = MemSortP );
}:

template<class N, class T> bool CStaticTable<N, T>::Sort( const TSort sortp )
{
    ::qsort( CStaticTable::mem, iused, sizeof( T ), _compare_function( sortp ) );
    
    return true;
}



Проблема в том что CStaticTable::mem нигде  в классе не определен.
В базовом классе его тоже нет.
Код

class CBaseRecord {
private:
// ...
public:
// перегруженные операторы new  и delete
};


никаких #define для mem тоже не обнаружено.
Очевидно что CStaticTable::mem должен быть  T CStaticTable::table[N::eAmount]

Теперь парадокс. Код компилируется на VC 6.0  но на VS 2005 компилироваться отказывается.
Кто может объяснить???

Автор: Alek86 19.3.2008, 16:16
ты скопировал с компилера?
тогда как компилится
Код
}:

???

Добавлено через 1 минуту и 54 секунды
и второе. что будет в VS 6.0 если написать (после строки с qsort):

а. CStaticTable::mem;
б. CStaticTable<N, T>::mem;
в. mem;

?

Автор: alexsid1982 20.3.2008, 20:55
по первому - моя ошибка

по второму 

в VC все работает на ура
в VS 2005 ничего не работает

Вот такая ошибка
Error    15    error C2039: 'mem' : is not a member of 'CStaticTable<N,T>'    367    

Автор: bsa 20.3.2008, 21:17
А ты случаем не пытаешься этот шаблон во втором случае использовать? А то умные книжки по шаблонам говорят, что компилятор проверяет их только на соответствие синтаксису, если они не используются.

Автор: alexsid1982 21.3.2008, 20:09
Так он и в первом случае используется...

Смысл в том, что один и тот же код на VC6.0 
компилируется, а на VS2005 не компилируется. Вот что расстраивает.

Автор: Любитель 22.3.2008, 23:40
Можо полный код или сцылку, откуда сие?

Автор: Earnest 24.3.2008, 13:58
Цитата(alexsid1982 @  21.3.2008,  21:09 Найти цитируемый пост)
Смысл в том, что один и тот же код на VC6.0 
компилируется, а на VS2005 не компилируется. Вот что расстраивает. 

А чего удивляться, компиляторы-то разные. 6й был более всеядным и некоторые баги прощал. А 2003 (и последующие) лучше диагностирует, вот и все.

Автор: Alek86 24.3.2008, 14:02
Цитата(Earnest @  24.3.2008,  13:58 Найти цитируемый пост)
 некоторые баги

ничего себе "некоторые баги"...
сам по себе переменные в классы добавлять...
smile

думаю, что проблема в том, что у тебя 2 класса CStaticTable определено. Твой и стандартный. И они как-то пересекаются
А в VS2005 стандартный убрали или отсунули куда-то

Автор: Dennnis 24.3.2008, 14:18
А объект класса template<class N, class T> class CStaticTable где-нибудь создается? Просто тела методов шаблонных классов не проверяются при компиляции если не создан объект этого класса.

Автор: Alek86 24.3.2008, 14:23
Dennnis
Цитата(alexsid1982 @  21.3.2008,  20:09 Найти цитируемый пост)
Так он и в первом случае используется...


Автор: alexsid1982 31.3.2008, 14:37
забил на попытки понять в чем смысл...
Переделал на использование T CStaticTable::table[N::eAmount]

Вроде работает smile

ЗЫ: Вариант с двумя классами не прокатил.... 

Код тоже предоставить не можно... Полный код весит очень много 
+ проект закрытый...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)