c++ - 模板标签的困惑

标签 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> .

当我通过 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' (特殊情况)。

关于c++ - 模板标签的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9486100/

相关文章:

object - Kotlin中嵌套对象声明的可访问性不一致

c++ - Linux 64bit 调用约定使用寄存器传递 'this' 指针,但代码效率较低?

c++ - 定义一个只有标题的类 - 找不到不存在的 cpp

c++ - `std::function` 和之前推导的模板参数的替换失败 - 为什么?

c++ - 会有标准类型列表吗?

c++ - 为什么我会收到编译器错误,尽管大小是常量?

c++ - 使用字符串流时如何停止 double 转换为科学计数法

c++ - 关闭套接字时防止 FIN_WAIT2

c++ - C++11 标准中的哪条规则描述了下面提到的匹配?

c++ - 我解决了一个问题,不知道背后的原因