2012-04-20 4 views
3
#include <iostream> 
using namespace std; 

template <class T1, class T2> 
class A { 
public: 
    void taunt() { cout << "A"; } 
}; 

template <class T1> 
class A<T1, T1> { 
public: 
    void taunt() { cout << "B"; } 
}; 

class B {}; 

class C {}; 

int main (int argc, char * const argv[]) { 

    A<B> a; 

    return 0; 
} 

Как преобразовать два параметра шаблона в шаблон одного параметра?C++ частичная специализация: как я могу выделить этот шаблон <class T1, class T2> в этот шаблон <class T1>?

Приведенный выше код даст ошибку компилятора на 'A a;' за «неправильное количество аргументов шаблона».

ответ

6

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

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

#include <iostream> 
using namespace std; 

template <class T1, class T2=T1> 
class A { 
public: 
    void taunt() { cout << "A"; } 
}; 

template <class T1> 
class A<T1, T1> { 
public: 
    void taunt() { cout << "B"; } 
}; 

class B {}; 

class C {}; 

int main (int argc, char * const argv[]) { 

    A<B> a; 
    a.taunt(); // Prints "B" 

    return 0; 
} 
+2

Было бы приятно добавить, почему вам нужен аргумент по умолчанию для достижения того, что он хочет ответить. Проблема вызвана неправильным пониманием того, что делает частная специализированная специализация. Это не позволяет вам уменьшить количество параметров шаблона в оригинальной декларации. Он говорит, что «если оба аргумента шаблона одинаковы, используйте этот». Еще +1 для правильного ответа. :) – vhallac

+0

@vhallac: Хороший комментарий, сделано :) – Kleist

1

Вы можете использовать (разумный) по умолчанию для второго типа инстанцировании:

template <class T1, typename T2 = void> 
class A { 
public: 
    void taunt() { cout << "A"; } 
}; 

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

  • Нет связанных вопросов^_^