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

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

Восстановить пароль Регистрация
 
tapochka
30 / 30 / 7
Регистрация: 25.04.2014
Сообщений: 412
13.01.2016, 22:42     шаблон вылетает #1
подскажите в чем проблема, вылетает код:
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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2016, 22:42     шаблон вылетает
Посмотрите здесь:

программа вылетает. C++
Вылетает программа C++
C++ Вылетает программа
C++ Вылетает прога
C++ Вылетает программа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
5113 / 2114 / 403
Регистрация: 15.11.2014
Сообщений: 4,799
Завершенные тесты: 1
13.01.2016, 23:02     шаблон вылетает #2
Цитата Сообщение от tapochka Посмотреть сообщение
typedef kl::for_vnew<2, 10> kl;
WTF ???
Perfilov
264 / 165 / 43
Регистрация: 25.02.2015
Сообщений: 435
13.01.2016, 23:29     шаблон вылетает #3
ну у вас там вечный apply. т.к. в специализации для 100 задано лишь value. т.е. либо вечный apply, либо, если дойдет до struct for_vn < N, 100 > - ошибка компиляции, т.к. там нет apply.
попробуйте сделать сперва рантайм версию того, что вы тут написали. если не крашнится из-за рекурсий - то можно попробовать в статиктайм переложить. в целом какая-то непонятнодлячегохрень.
tapochka
30 / 30 / 7
Регистрация: 25.04.2014
Сообщений: 412
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) {
     }
}
Perfilov
264 / 165 / 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 нигде не суммируеся. все криво в общем.
tapochka
30 / 30 / 7
Регистрация: 25.04.2014
Сообщений: 412
14.01.2016, 01:13  [ТС]     шаблон вылетает #6
да на коленках набросал шляпу... надо будет мозг подключить
Perfilov
264 / 165 / 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;
}
так хотябы будет понятно что вы там задумали.
tapochka
30 / 30 / 7
Регистрация: 25.04.2014
Сообщений: 412
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;
}
что тут не так?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2016, 09:28     шаблон вылетает
Еще ссылки по теме:

C++ Вылетает программа
Вылетает программа C++
C++ Ошибка при компиляции:"C2955 "Tree": для использования класс шаблон требуется список аргументов шаблон"

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

Или воспользуйтесь поиском по форуму:
DrOffset
6420 / 3794 / 877
Регистрация: 30.01.2014
Сообщений: 6,584
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 было написано ну очень уж извращенно.
Yandex
Объявления
14.01.2016, 09:28     шаблон вылетает
Ответ Создать тему
Опции темы

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