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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
tapochka
40 / 40 / 8
Регистрация: 25.04.2014
Сообщений: 499
#1

шаблон вылетает - C++

13.01.2016, 22:42. Просмотров 247. Ответов 8
Метки нет (Все метки)

подскажите в чем проблема, вылетает код:
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
template<size_t N, size_t M>
    struct for_vn {
        struct apply {
            enum { value = 0 };
        };
        enum { value = for_vn<N, M+N>::apply::value };  //тут вылетает,
//рекурсивный тип или слишком сложный контекст
    };
 
    template<size_t N>
    struct for_vn < N, 100 > {
        enum { value = 1 };
    };
 
    template<size_t N=2, size_t max=10>
    struct for_vnew {
        template<std::size_t M>
        struct apply {
            enum { value = for_vn<M, M*M>::value };
        };
        enum { value = for_vnew<N+1, max>::template apply<N>::value };
    };
 
    template<size_t max>
    struct for_vnew<max, max> {
        template<std::size_t M>
        struct apply {
            enum { value = 1 };
        };
        enum { value = 1 };
    };
int main() {
typedef kl::for_vnew<2, 10> kl;
    int s = kl::value;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2016, 22:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос шаблон вылетает (C++):

Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон - C++
Есть у меня 3 структуры Трамвай , Троллейбус , Автобус. Для автобуса определены функции (работают) Троллейбус и Трамвай одинаковые поля...

Ошибка при компиляции:"C2955 "Tree": для использования класс шаблон требуется список аргументов шаблон" - C++
Есть класс бинарного дерева, в нем структура. Класс - Tree, структура - list(листик, а не список). При компиляции выдает...

Вылетает программа - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; struct game2048 { int ar; void start() {

Вылетает программа - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &quot;students.h&quot; int *schetchik = new int(1); bool truepass (std::string passwordf) { ...

Вылетает программа - C++
Здравствуйте! Сама формулировка задачи: Массив записей содержит информацию о результатах сдачи зимней сессии: фамилия, шифр группы,...

Вылетает программа - C++
Почему-то после запуска вылетает программа. Помогите найти ошибку. Написана в 3 файлах. 1: class Array{ public: ...

8
hoggy
6673 / 2859 / 491
Регистрация: 15.11.2014
Сообщений: 6,380
Завершенные тесты: 1
13.01.2016, 23:02 #2
Цитата Сообщение от tapochka Посмотреть сообщение
typedef kl::for_vnew<2, 10> kl;
WTF ???
0
Perfilov
264 / 164 / 43
Регистрация: 25.02.2015
Сообщений: 435
13.01.2016, 23:29 #3
ну у вас там вечный apply. т.к. в специализации для 100 задано лишь value. т.е. либо вечный apply, либо, если дойдет до struct for_vn < N, 100 > - ошибка компиляции, т.к. там нет apply.
попробуйте сделать сперва рантайм версию того, что вы тут написали. если не крашнится из-за рекурсий - то можно попробовать в статиктайм переложить. в целом какая-то непонятнодлячегохрень.
0
tapochka
40 / 40 / 8
Регистрация: 25.04.2014
Сообщений: 499
14.01.2016, 00:30  [ТС] #4
Цитата Сообщение от hoggy Посмотреть сообщение
WTF ???
вот так можно:
C++
1
typedef for_vnew kl;
Цитата Сообщение от Perfilov Посмотреть сообщение
в целом какая-то непонятнодлячегохрень.
примерно это в компайл-тайме:
C++
1
2
3
4
for(;i<N;++i) {
     for(;j<M;j+i) {
     }
}
0
Perfilov
264 / 164 / 43
Регистрация: 25.02.2015
Сообщений: 435
14.01.2016, 01:10 #5
я имел в виду другое. что=то вроде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace runtime
{
  std::size_t for_vn(std::size_t N, std::size_t M)
  {
    if (M == 100)
    {
      return 1;
    }
    return for_vn(N, N+M);
  }
 
  std::size_t for_vnew(std::size_t N, std::size_t max)
  {
    return for_vn(N, N*N);
  }
}
не факт что я все верно понарасставлял, но смысл думаю понятен.
из того, что у вас написано нифига не понятно в чем задумка.
однако возможные ошибки были указаны - либо бесконечное инстанцирование
template<size_t N, size_t M> struct for_vn если M не будет равно 100, либо ошибка копиляции
из=за того что в специализации template<size_t N> struct for_vn<N, 100> нет apply.

вот ошибки студии:
1> see reference to class template instantiation 'for_vn<N,M>' being compiled
1> with
1> [
1> N=8,
1> M=104
1> ]
1> : see reference to class template instantiation 'for_vn<N,M>' being compiled
1> with
1> [
1> N=8,
1> M=96
1> ]

т.е. соточку проскочили, в результате бесконечное инстанцирование пока компилятор не сдастся.

Добавлено через 5 минут
и еще в шаблонах value нигде не суммируеся. все криво в общем.
1
tapochka
40 / 40 / 8
Регистрация: 25.04.2014
Сообщений: 499
14.01.2016, 01:13  [ТС] #6
да на коленках набросал шляпу... надо будет мозг подключить
0
Perfilov
264 / 164 / 43
Регистрация: 25.02.2015
Сообщений: 435
14.01.2016, 01:16 #7
вы бы рантайм функцию написали по которой можно было бы составить статиктайм расчет. функцию вроде:
C++
1
2
3
4
5
6
7
8
9
10
std::size_t for_vnew(std::size_t n, std::size_t max)
{
  if (n == max)
  {
     return 1;
  }
 
  // else бла бла бла
  return something;
}
так хотябы будет понятно что вы там задумали.
0
tapochka
40 / 40 / 8
Регистрация: 25.04.2014
Сообщений: 499
14.01.2016, 03:11  [ТС] #8
да вот хотя бы эту:
C++
1
2
3
4
5
6
for(;i<N;++i) {
     for(;j<M;j+i) {
          if(j==100)
               return 1;
     }
}
лень думать что-то...

Добавлено через 1 час 28 минут
вот, допустим, есть код:
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
template<size_t N, size_t M>
    struct for_vn {
        enum { value = std::conditional<std::integral_constant<bool, N % 2 ==0>::value, for_vn<N,M+N>, std::integral_constant<int, 0>>::type::value };
    }; 
 
    template<std::size_t N>
    struct for_vn < N, 100 > {
        enum { value = 1 };
    };
 
        template<size_t index>
    struct arr_impl {
        enum { value = for_vn< index, 0 >::value };
    };
 
    template<size_t index>
    struct arr {
        enum { value = arr_impl<index>::value };
    };
 
int main() {
std::cout<<
arr<11>::value<<    //выводит 0
arr<12>::value<<    //тут начинает ругаться, что в for_vn рекурсивный тип
std::endl;
}
что тут не так?
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
14.01.2016, 09:28 #9
Цитата Сообщение от tapochka Посмотреть сообщение
что тут не так?
Сумма (N + M) перелетает через сотку.
Сделай условие останова >= 100, тогда все выправится.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
template<size_t N, size_t M, bool = (N + M >= 100)>
struct for_vn
    : std::conditional<(N % 2 == 0), for_vn<N, N + M>, std::integral_constant<int, 0>>::type
{ }; 
 
template<std::size_t N, std::size_t M>
struct for_vn<N, M, true> 
{
    enum { value = 1 };
};

Runtime алгоритм тоже бы циклился.
Это кстати очень здравый совет, сперва реализовать это обычным способом, пользуйся им

PS. Условие в std::conditional было написано ну очень уж извращенно.
1
14.01.2016, 09:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2016, 09:28
Привет! Вот еще темы с ответами:

Вылетает программа - C++
Компилятор ошибок не выдает. В ходе работы программы вылетает окно: Скриншот Вот код: #include &lt;iostream&gt; using namespace std; ...

Программа С++ вылетает - C++
Вылетает.Я новичок в с++ подскажите может надо что то дописать? #include &lt;iostream&gt; // Подключение библиотеки потокового ввода/вывода ...

Вылетает программа - C++
Здравствуйте еще раз! Сама по себе программа работает корректно, но после вывода информации в консоль, вылетает. #include...

Вылетает программа - C++
Вот что пишет: вот код: /*С клавиатуры вводятся две строки, содержащие некоторые слова, перечисленные через точку с запятой....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru