模板标签的困惑

时间:2012-02-28 16:46:49

标签: c++ templates compiler-errors

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

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>的模板专用实现。
  4. 当我通过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 个答案:

答案 0 :(得分:3)

如果你正在尝试我认为你试图尝试的东西,那么你需要完全专注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'(专业案例)。