noob在这里仍在试验模板。试图编写消息处理类模板
template <typename T> class MessageProcessor {
//constructor, destructor defined
//Code using t_ and other functions
foo( void ) {
//More code in a perfectly fine method
}
private: T *t_
};
全部在头文件中定义。我已经建立并测试了我的课程,一切都很好。现在,我正在尝试这样做:
template <typename T> class MessageProcesor {
//Same stuff as before
foo(void) {
//Same code as before in foo, but one new line:
t_->getMessageSender<MessageType>();
}
private: T *t_;
};
然而,这行在“&gt;”之前给出了错误表达类型的错误令牌。
我添加了必要的头文件来定义MessageType是什么。我之前很久就使用过这个函数,只是不是在这种情况下。
我怀疑编译器不喜欢模板函数在未定义的类模板(unspecialized?)中完全定义(专用?)的事实。我并不完全了解模板“专业化”的原因。大多数解释都集中在“完整”或“部分”的概念上,而不是首先使它成为专业的概念。
如果您想查看更多代码,请道歉。我在工作时没有互联网接入,这就是我正在做的事情,所以我必须把所有东西都放在我的心理'暂存器'中并把它带回家。
答案 0 :(得分:9)
你的成员函数'foo'需要一个返回类型,你需要在依赖表达式中使用成员模板时使用关键字'template'(表达式的含义直接或间接依赖于通用模板参数)
t_->template getMessageSender<MessageType>(); // ok
t_->getMessageSender<MessageType>(); // not ok
也许这个例子可以帮助您理解成员模板需要以'template'关键字作为前缀[注意:为了对称,您可以始终在成员上使用'模板'前缀模板,但在非依赖表达式上使用时,它是可选的。
struct MyType
{
template<class T> void foo() { }
};
template<class U>
struct S
{
template<class T>
void bar()
{
MyType mt; // non-dependent on any template parameter
mt.template foo<int>(); // ok
mt.foo<int>(); // also ok
// 't' is dependent on template parameter T
T t;
t.template foo<int>(); // ok
t.foo<int>(); // not ok
S<T> st; // 'st' is dependent on template parameter T
st.template foo<int>(); // ok
st.foo<int>(); // not ok
S<MyType> s; // non-dependent on any template parameter
s.bar<int>(); // ok
s.template bar<int>(); // also ok
}
};
希望有所帮助。
答案 1 :(得分:2)
在template
和模板方法名称之间添加关键字->
:
t_->template getMessageSender<MessageType>();
答案 2 :(得分:0)
可能,此时还不知道MessageType。您是否缺少包含,命名空间解析或声明?
如果不是,getMessageSender
如何宣布,MessageType
怎么样?
通常,在C ++中,如果在那时不知道T(这很复杂,但仍然是),这不是问题。
此外,错误消息通常包含尝试实例化的类型。尝试至少发布完整的错误消息。
答案 3 :(得分:0)
您是否对getMessageSender之类的方法进行了其他类似的调用?
t_->getMessageSender<MessageType>();
答案 4 :(得分:0)
这只是你失去的函数的返回类型。 t_
成员已完全定义。
模板的特化是特定模板参数的实现的“特殊”版本。例如:std::vector
是通用std::vector
的专用版本。
部分特化是您的通用代码的实现,其中并未提供所有模板参数。
答案 5 :(得分:0)
这在Visual Studio 2010编译器上运行良好。
class One
{
public:
void newFoo() ;
template < class T > void foo()
{
T obj ; // obj is dependent on template parameter
obj.newFoo() ; // and this works
}
}
只是为了更新答案!!!