显式实例化通用结构的通用成员函数

时间:2010-03-29 21:07:41

标签: c++ templates

我有一个带有模板参数Stream的结构。在该结构中,有一个具有自己的模板参数Type的函数。

如果我试图强制生成和调用函数的特定实例,它可以正常工作,如果我在已知结构的确切类型的上下文中。如果没有,我收到编译错误。这感觉就像我错过了typename,但没有嵌套类型。我怀疑我遗漏了一些基本的东西,但我一直盯着这段代码,所以我看到的都是红头发,坦率地编写使用模板的代码从来都不是我的强项。

以下是我能想出的最简单的例子,说明了这个问题。

#include <iostream>

template<typename Stream>
struct Printer {
  Stream& str;
  Printer(Stream& str_) : str(str_) { }

  template<typename Type>
  Stream& Exec(const Type& t) {
    return str << t << std::endl;
  }
};

template<typename Stream, typename Type>
void Test1(Stream& str, const Type& t) {
  Printer<Stream> out = Printer<Stream>(str);
  /****** vvv This is the line the compiler doesn't like vvv ******/
  out.Exec<bool>(t); 
  /****** ^^^ That is the line the compiler doesn't like ^^^ ******/
}

template<typename Type>
void Test2(const Type& t) {
  Printer<std::ostream> out = Printer<std::ostream>(std::cout);
  out.Exec<bool>(t);
}

template<typename Stream, typename Type>
void Test3(Stream& str, const Type& t) {
    Printer<Stream> out = Printer<Stream>(str);
    out.Exec(t);
}

int main() {
  Test2(5);
  Test3(std::cout, 5);
  return 0;
}

如上所述,gcc-4.4给出了以下内容:

  

test.cpp:在函数'void Test1(Stream&amp;,const Type&amp;)'中:
  test.cpp:22:错误:在'bool'之前预期的primary-expression
  test.cpp:22:错误:预期';'在'bool'之前

Test2Test3都编译干净,如果我注释Test1程序执行,我得到“1 5”,如我所料。所以看起来我想要做的事情没有什么不妥,但我在实现中拙劣。

如果有人能够对我所忽视的内容有所了解,我们将不胜感激。

1 个答案:

答案 0 :(得分:3)

您需要告诉编译器依赖名称Printer<Stream>::Exec是模板:

out.template Exec<bool>(t);

这与typename的原理相同,只是在这种情况下,有问题的名称不是类型,而是模板。