我有一个带有模板参数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'之前
Test2
和Test3
都编译干净,如果我注释Test1
程序执行,我得到“1 5”,如我所料。所以看起来我想要做的事情没有什么不妥,但我在实现中拙劣。
如果有人能够对我所忽视的内容有所了解,我们将不胜感激。
答案 0 :(得分:3)
您需要告诉编译器依赖名称Printer<Stream>::Exec
是模板:
out.template Exec<bool>(t);
这与typename
的原理相同,只是在这种情况下,有问题的名称不是类型,而是模板。