Конструкция шаблона: составлять шаблоны из шаблонов - PullRequest
4 голосов
/ 07 января 2012

Способ составления template<int> из template<int, int>

. Я пробовал следующий код, но он не компилируется:

#include <iostream>
template<int N, int M>
struct A { enum E { n = N, m = M }; };

template<template<int> class C>
struct B : public C<8> { };

int main(int argc, const char *argv[])
{
    typedef B< A<4> > T;
    T b;

    std::cout << T::n << std::endl;
    std::cout << T::m << std::endl;
    return 0;
}

Ошибка:

test3.cxx: In function ‘int main(int, const char**)’:
test3.cxx:10:23: error: wrong number of template arguments (1, should be 2)
test3.cxx:3:12: error: provided for ‘template<int N, int M> struct A’
test3.cxx:10:25: error: template argument 1 is invalid
test3.cxx:10:28: error: invalid type in declaration before ‘;’ token
test3.cxx:13:22: error: ‘T’ is not a class or namespace
test3.cxx:14:22: error: ‘T’ is not a class or namespace

Ответы [ 2 ]

3 голосов
/ 07 января 2012

Следующий код выводит 4 и 8, надеюсь, я правильно понял ваш смысл. Количество параметров в вашем шаблоне-шаблоне не совпадает с номером шаблона, который вы передали.

#include <iostream>
template<int N, int M>
struct A { enum E { n = N, m = M }; };

template<template<int, int> class C, int Num>
struct B : public C<Num, 8> { };

int main(int argc, const char *argv[])
{
    typedef B< A, 4 > T;
    T b;

    std::cout << T::n << std::endl;
    std::cout << T::m << std::endl;
    return 0;
}
2 голосов
/ 07 января 2012

По крайней мере, в C ++ 03 параметр шаблона шаблона должен иметь именно то количество требуемых аргументов.

Одним из способов достижения этого было бы создание нового шаблона с правильной арностью, которая делегируется исходному шаблону:

template<int M>
struct Hack : A<4, M> { };

...

typedef B<Hack> T;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...