6

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

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 是什么。我以前用过这个函数很多次,只是没有在这个上下文中。

我怀疑编译器不喜欢模板函数在未定义的类模板(未专门化?)中完全定义(专门化?)的事实。我并没有完全理解是什么让模板“专业化”。大多数解释都集中在“完整”或“部分”的概念上,而不是首先使其专业化的原因。

抱歉,如果您想查看更多代码。我在工作中没有互联网接入,这就是我做这件事的地方,所以我必须把所有东西都放在我的心理“便签本”中,然后把它带回家。

4

6 回答 6

11

您的成员函数 'foo' 需要一个返回类型,并且当您在依赖表达式(其含义直接或间接依赖于通用模板参数的表达式)中使用成员模板时,您需要使用关键字 'template'

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

  }

};

希望有帮助。

于 2009-07-07T07:33:27.353 回答
2

添加关键字templatebetween->和模板方法的名称:

t_->template getMessageSender<MessageType>();
于 2009-07-07T07:41:29.490 回答
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
    }
}

只是为了保持答案更新!

于 2011-01-05T03:04:13.400 回答
0

那时可能不知道 MessageType。您是否缺少包含、命名空间解析或声明?

如果不是这样,如何getMessageSender声明,又如何MessageType

一般来说,在 C++ 中,如果 T 在那一点上是未知的,这不是问题(嗯......这很复杂,但仍然如此)。

此外,错误消息通常包含尝试实例化的类型。至少尝试发布完整的错误消息。

于 2009-07-07T07:32:03.657 回答
0

您是否对模板化的 getMessageSender 等方法有其他类似的调用?

t_->getMessageSender<MessageType>();
于 2009-07-07T07:33:53.293 回答
0

只是缺少函数的返回类型。t_成员是完全定义的。

模板的特化是您为特定模板参数实现的“特殊”版本。一个例子:std::vector是通用的专用版本std::vector

部分特化是通用代码的实现,其中并未提供所有模板参数。

于 2009-07-07T09:10:28.747 回答