【问题标题】:A Template-Tag Perplexity模板标签的困惑
【发布时间】:2012-02-28 16:46:49
【问题描述】:

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

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. BTI 的模板参数是Tag&lt;i&gt; 时,提供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 没有模板化,也就是说它从不使用 T。专业化返回一个无符号字符,而不是一个字符??
  • func 不是模板函数,所以你不能专门化它。我认为您可能必须专门研究整个班级,或者可能使 func 成为独立的帮助器(模板)功能。我要演戏……
  • 添加到 @BoBTFish 所说的内容中,即使 func 是一个函数模板,您也可以仍然不专门化它,因为您尝试了 partial专业化和 C++ 仅支持函数模板的完全专业化(与类模板相反)。

标签: c++ templates compiler-errors


【解决方案1】:

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

【讨论】:

  • 是的。这一点,再加上 BoBTFish 和 Konrad Rudolph 的上述 cmets 都非常出色;谢谢!
  • 特别是,如果没有class BTI&lt;Tag&lt;i&gt; &gt; 的定义,您的版本将不会工作,但如果@ 没有class BTI&lt;Tag&lt;i&gt; &gt; 的定义,工作987654327@'s 是完全专业的。 (就像这样:template&lt;&gt; unsigned char BTI&lt;Tag&lt;0&gt; &gt;::func(char c) {return c;})这与@Konrad 的评论完全一致。 :)
猜你喜欢
  • 1970-01-01
  • 2011-04-16
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
相关资源
最近更新 更多