2012-01-06 2 views
4

Есть ли способ, чтобы составить template<int> из template<int, int>шаблона: составить шаблоны из шаблонов

Я попытался ом следующий код, но он не copmile:

#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 
+0

вы используете C++ 11? –

+0

Нет, но будет ли это иметь значение? – Allan

+1

Возможно. Шаблонные псевдонимы можно использовать, чтобы помочь сгладить ситуацию, но они существуют только в C++ 11. –

ответ

2

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

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

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

... 

typedef B<Hack> T; 
+0

Вы имеете в виду 'typedef B >'? –

+0

@dark № B ожидает передачи шаблона с одним параметром int; Hack соответствует этому требованию. –

+0

Я вижу, спасибо за разъяснение. –

3

Следующий код распечатывает 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; 
} 
Смежные вопросы