这里的菜鸟仍在尝试模板。尝试编写一个消息处理类模板

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
    }
}

只是为了保持更新的答案!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top