C++ 中的类模板内的模板类
-
11-09-2019 - |
题
这里的菜鸟仍在尝试模板。尝试编写一个消息处理类模板
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_;
};
但是,这一行在“>”标记之前给了我错误的表达式类型错误。
我添加了必要的头文件来定义 MessageType 是什么。我以前多次使用过这个函数,只是不是在这个上下文中。
我怀疑编译器不喜欢模板函数在未定义的类模板(非专业化?)中完全定义(专业化?)。我还没有完全理解是什么让模板“专业化”。大多数解释都集中在“完整”或“部分”的概念上,但并不是它首先专业化的原因。
如果您想查看更多代码,我们深表歉意。我在工作时无法访问互联网,而这就是我做这件事的地方,所以我必须将所有内容放入我的精神“便签本”中并将其带回家。
解决方案
您成员函数“富”需要一个返回类型,你需要,当你在相关的表达式中使用成员模板使用关键字“模板”(表达式,其含义直接或间接依赖于一个通用模板参数)
t_->template getMessageSender<MessageType>(); // ok
t_->getMessageSender<MessageType>(); // not ok
也许这个例子可以帮助你明白,当一个成员模板的需要的由“模板”关键字[注前缀:在对称利息你可以一直使用“模板”前缀的成员模板,但在非依赖的表达使用时,它是任选的。
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
}
};
希望有所帮助。
其他提示
添加template
和模板方法的名称之间的关键字->
:
t_->template getMessageSender<MessageType>();
可能当时还不知道 MessageType。您是否缺少包含、名称空间解析或声明?
如果不是这样,怎么办 getMessageSender
声明,以及如何声明 MessageType
?
一般来说,在 C++ 中,如果此时 T 未知,那么这不是问题(嗯......这很复杂,但仍然)。
此外,错误消息通常包含尝试实例化的类型。尝试至少发布完整的错误消息。
你有像getMessageSender被模板化的方法,其他类似的电话?
t_->getMessageSender<MessageType>();
这只是你的函数的返回值类型是不可少的。所述t_
构件被完全限定。
模板的专业化是一个“特殊”版本的实现对特定模板参数。一个例子:std::vector
是通用std::vector
的专门版本
一个部分特例是其中不提供所有模板参数的通用代码的实现方式。
这正常工作的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
}
}
只是为了保持更新的答案!