2013-05-20 2 views
2
// p1: some value 
// nt: native type 
template<int p1, typename nt> 
struct A {}; 

// pt: pointer to type i.e. int* 
// tA: a specialization of A 
template<typename pt, typename tA> 
struct B1 {}; 

// pt: pointer to type i.e. int* 
// tA: a specialization of A 
template<typename pt, typename tA> 
struct B2 {}; 

// tB: specialization of B? 
// tA: specialization of A 
template<typename tB, typename tA> 
struct C {}; 

// now i want to create a C partial specialization where: 
// A<some_value, native_type> 
// B?<char*, A<some_value, native_type> > 

template< template<typename, typename> class B, int p1, typename nt > 
struct C< B<char*, A<p1, nt> >, A<p1, nt> > {}; 

int main() 
{ 
    C< B1, A<10, int> > c; 
} 

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

error: use of class template B1 requires template arguments 
    C< B1, A<10, int> > c; 
     ^~ 

Я понимаю ошибку и исправить ее B1 должны быть B1<char*, A<10, int> >. Должен ли компилятор вычитать значение этих параметров из наиболее подходящей специализации?

+0

Какой компилятор это? У некоторых проблемы с шаблонами шаблонов. – StoryTeller

+0

clang 3.2 для ubuntu –

+0

'C' требует два типа. Поэтому нет смысла говорить 'C

ответ

4

Should the compiler deduct the value of these parameters from the most matched specialization?

Я не уверен, что я понимаю ваш вопрос, но если да, тогда ответ будет «Нет». Компилятор понятия не имеет, как вывести полностью созданный тип (специализация B1, в данном случае) из голого имени шаблона класса (B1, в данном случае). Вы должны указать аргументы шаблона для B1.

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

Тот факт, что вы используете параметр шаблона шаблон B в вашей специализации шаблона для того, чтобы соответствовать этим параметрам типа, которые являются экземплярами B не меняет того факта, что параметры основного шаблона являются два (полностью инстанцирован) типы.

+0

Даже шаблон шаблона шаблона? Это кажется странным. – StoryTeller

+0

@StoryTeller: первичный шаблон принимает два типа параметров. Шаблон шаблона используется только в специализации первичного шаблона для описания первого из этих параметров типа. –

+1

Ах! Теперь я это вижу. Пропустил это как специализацию. +1 – StoryTeller

Смежные вопросы