Форум программистов, компьютерный форум CyberForum.ru

Шаблоны или ... (Maximum option context replay depth exceeded) - C++

Восстановить пароль Регистрация
 
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
18.06.2012, 01:16     Шаблоны или ... (Maximum option context replay depth exceeded) #1
Код отсюдВа http://habrahabr.ru/post/38622/
C++
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//------------------------------------------------------------
template <unsigned long t> struct Polynome  { static const unsigned long value = t&1 ? (t>>1)^0xedb88320 : t>>1;   };
template <unsigned long t, int i> struct For { static const unsigned long value = For<Polynome<t>::value,i-1 >::value; };
template <unsigned long t> struct For<t,0>  { static const unsigned long value = Polynome<t>::value;         };
template <unsigned long t> struct Hash    { static const unsigned long value = For<t,7>::value;           };
 
template<int r, int t> struct Table : Table<r+1, t-1>
 {
   Table() { values[t]= Hash<t>::value; }
 };
 
template<int r> struct Table<r,0>
 {
   int values[r+1];
   Table() { values[0]=Hash<0>::value; }
   int operator[](int i) {  return values[i];}
 };
 
typedef Table<0,255> CRC_TABLE;
 
class Crc32Hasher
 {
   CRC_TABLE crc_table;
public:
    unsigned long GetHashCode(const void* pObj, size_t length)
   {
    const char* buf = (const char*)pObj;
    unsigned long crc32=0xffffffff;
 
    for (size_t i=0; i<length; i++)
     crc32=crc_table[ (crc32^(*buf++))&0xff ]  ^(crc32>>8);
     crc32=crc32^0xffffffff;
     return crc32;
    }
 };
//--------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
 
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
Ошибка:
Код
[BCC32 Error] main.cpp(36): E2489 Maximum option context replay depth exceeded; check for recursion
Вопрос можно ли это поправить как то в настройках?

(Пробывал на Visual код компилится хоть и затяжно, но так и должно быть)

Скрин:
Миниатюры
Шаблоны или ... (Maximum option context replay depth exceeded)  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2012, 01:16     Шаблоны или ... (Maximum option context replay depth exceeded)
Посмотрите здесь:

C++ шаблоны
Шаблоны C++
C++ Шаблоны C++11
C++ Шаблоны. Что лучше <class T> или <typename T>?
Choose three integers out of N: numbers whose product is maximum C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
18.06.2012, 23:10  [ТС]     Шаблоны или ... (Maximum option context replay depth exceeded) #2
Справка говорит:
Go Up to Compiler Errors And Warnings (C++) Index
If this error is triggered, it means that recursive template instantiation has gone too deep. Check for compile-time recursion in your program, and limit it to no more than 256 levels.
И действительно если изменить на
C++
1
typedef Table<0,253> CRC_TABLE;
То компилится.

Интересно какое же критическое количество рекурсий у VS что позволяет ей компилировать???

Но что меня удивило что g++ вообще код не проканал:
Код
****/Рабочий стол/Linux,Проекты /g++/meta- programming - temlate$ g++ main.cpp -o prog
main.cpp: In constructor ‘Table<r, t>::Table()’:
main.cpp:11: error: ‘values’ was not declared in this scope
Что то вроде того сказал и QtCreator....

Хотя всмотревшись в код я тоже не понимаю почему оно вообще должно пахать?
C++
1
2
3
4
template<int r, int t> struct Table : Table<r+1, t-1>
 {
   Table() { values[t]= Hash<t>::value; } // строка 11
 };
Откуда знать что такое values[t] ?
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
19.06.2012, 18:17     Шаблоны или ... (Maximum option context replay depth exceeded) #3
Массив values объявлен только в одном месте, следовательно, объяснение может быть только одно - компилятор почему-то считает, что структура
C++
1
template<int r, int t> struct Table : Table<r+1, t-1>
наследует от структуры
C++
1
template<int r> struct Table<r,0>
Хотя, я не очень понимаю, почему. Синтаксис объявления последней структуры выглядит как-то странно... может, намеренно используются какие-то особенности vs?
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
19.06.2012, 18:58  [ТС]     Шаблоны или ... (Maximum option context replay depth exceeded) #4
Дык на Builder тоже компилится при Table<0,253>

Добавлено через 15 минут
наследует от структуры
Ну а как же порядок... структура Table<r,0> объявлена позже...
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
19.06.2012, 19:10     Шаблоны или ... (Maximum option context replay depth exceeded) #5
Сам не врубаюсь... но больше компилятору values брать просто неоткуда.
Yandex
Объявления
19.06.2012, 19:10     Шаблоны или ... (Maximum option context replay depth exceeded)
Ответ Создать тему
Опции темы

Текущее время: 02:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru