我设法将我的困惑浓缩为以下代码:
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;
}
这样做的目的是:
- 声明模板类
BTI
, - 声明模板化标记类
Tag
,并且 - 提供
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/