-1

编辑:这只是另一个案例“愚蠢而无趣的错误”。你已经被警告了:)

这是让我彻夜难眠的事情。也许具有较高 C++ 知识的人可以找到如何使其工作:

template<class T>
class Base
{
    virtual void Method ( T* arg ) = 0;
};

class Child : public Base<MyType>
{
    void Method ( MyType* arg ) { /*blah*/ };
};

这不会编译(至少在 VS2008 上不会),因为它无法将两个方法匹配在一起。

目前我们通过在 Method 声明中使用 BaseType 而不是 MyType 来解决它,然后在 Method 的 Child 实现中将 BaseType 转换为 MyType(我们仍然需要 MyType 作为基类中其他内容的模板)。

仍然能够直接使用模板化类型会很好。

编辑:谢谢大家,似乎修复其他错误(后面列出的)使它一切正常。我确实有template<class T>,而不是template<T>在我的原始代码以及列为公共的方法。这表明我应该在发布之前等待更长的时间。我为此道歉。

4

4 回答 4

4

这是编译和工作正常的完整示例:

struct MyType
{
};

template< class T>
class Base
{
public:
    virtual void Method ( T* arg ) = 0;
};

class Child : public Base<MyType>
{
  public:
    void Method ( MyType*  ) { /*blah*/ };
};


int main()
{
  MyType a;
  Child b;

  b.Method( &a );
}
于 2012-09-10T06:38:34.493 回答
2

您需要在第一类模板中使用正确的语法:

template<typename T> // here! You can also use "class" instead of "typename".
class Base
{
    virtual void Method ( T* arg ) = 0;
};

并且您的第二个类必须是类模板,除非MyType是类型:

template <typename MyType>
class Child : public Base<MyType>
{
    void Method ( MyType* arg ) { /*blah*/ };
};
于 2012-09-10T06:43:43.847 回答
1

在第一行写template<class T>而不是template<T>. 这样就可以了。

于 2012-09-10T06:39:35.603 回答
1

为了您想要的结果,您需要将基类方法公开

   template<class T> class Base
    {
        public: // public definition is important or else it won't be overridden
        virtual void Method ( T* arg ) {
            cout << "Method in base.";
        }
    };

class Child : public Base<char>
{
    void Method ( char* arg ) {
       cout << "Method in child.";
    };
};
于 2012-09-10T06:52:52.383 回答