模板标签难题

A Template-Tag Perplexity

本文关键字:难题 标签      更新时间:2023-10-16

我已经设法将我的困惑浓缩为以下代码:

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. 声明模板类CCD_ 1
  2. 声明模板化标记类Tag,以及
  3. BTI的模板参数是Tag<i>时,提供func的模板专用实现

当我通过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)’

我甚至不知道在这一点上该尝试什么。有什么想法吗?

如果你正在尝试我认为你正在尝试的东西,那么你需要完全专门化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'(特殊情况)。