我有一个带有模板参数的结构,
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&,const type&)”中:
test.cpp:22:错误:在“bool”之前需要主表达式
test.cpp:22:错误:应在“bool”之前输入“;”
Test2
和
Test3
这两种方法都能很好地编译,如果我不发表意见的话
Test1
程序执行,我得到我所期望的“15”。所以看起来我想做什么的想法没有什么错,但是我在实现中做了一些拙劣的事情。
如果有人能对我所忽略的事情有所了解,我将不胜感激。