Сложность шаблона-тега - PullRequest
       10

Сложность шаблона-тега

2 голосов
/ 28 февраля 2012

Мне удалось сжать мою путаницу до следующего кода:

template<typename T>
class BTI {
public:
    char func(char);
};

template<int i>
class Tag {};

template<int i> unsigned char
BTI<Tag<i> >::func(char c) {
    return c;
}

Это предназначено для:

  1. Объявить шаблон класса BTI,
  2. Объявите шаблонный класс тегов Tag и
  3. Предоставляет специализированную реализацию шаблона func, когда параметр шаблона BTI имеет значение Tag<i>.

Когда я запускаю это через g++ -fsyntax-only (используя g ++ 4.1.2.), Я получаю:

test.cc:11: error: invalid use of undefined type ‘class BTI<Tag<i> >’
test.cc:2: error: declaration of ‘class BTI<Tag<i> >’
test.cc:11: error: template definition of non-template ‘unsigned char BTI<Tag<i> >::func(char)’

Я даже не уверен, что попробовать на этом этапе. Есть идеи?

1 Ответ

3 голосов
/ 28 февраля 2012

Если вы пытаетесь сделать то, что я думаю, вы пытаетесь сделать, тогда вам нужно специализировать BTI целиком, а не только одну функцию; как это:

 template<typename T>
 class BTI {
 public:
     unsigned char func(char);
 };

 template<int i>
 class Tag {};

 template<int i>
 class BTI<Tag<i> > {
 public:
     unsigned char func(char);
 };

 template<typename T> unsigned char
 BTI<T>::func(char c) {
     return 'X';
 }

 template<int i> unsigned char
 BTI<Tag<i> >::func(char c) {
     return c;
 }

 int main() {
    BTI<int> x;
    BTI<Tag<0> > y;
    std::cout << x.func('a') << std::endl;
    std::cout << y.func('a') << std::endl;
 }

Сначала будет напечатано 'X' (общий случай), затем 'a' (специализированный случай).

...