Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板继承_C++_Templates_Inheritance - Fatal编程技术网

C++ C++;模板继承

C++ C++;模板继承,c++,templates,inheritance,C++,Templates,Inheritance,编辑:这只是另一个案例“愚蠢而无趣的错误”。您已被警告:) 有件事让我彻夜未眠。也许有较高C++知识的人可以找到如何工作:< /P> template<class T> class Base { virtual void Method ( T* arg ) = 0; }; class Child : public Base<MyType> { void Method ( MyType* arg ) { /*blah*/ }; }; 模板 阶级基础 {

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

有件事让我彻夜未眠。也许有较高C++知识的人可以找到如何工作:< /P>
template<class T>
class Base
{
    virtual void Method ( T* arg ) = 0;
};

class Child : public Base<MyType>
{
    void Method ( MyType* arg ) { /*blah*/ };
};
模板
阶级基础
{
虚空法(T*arg)=0;
};
类子:公共基
{
void方法(MyType*arg){/*blah*/};
};
这不会编译(至少在VS2008上不会),因为它无法将这两个方法匹配在一起

目前,我们通过在方法声明中使用BaseType而不是MyType来解决这个问题,然后在方法的子实现中将BaseType强制转换为MyType(我们仍然需要MyType作为基类中其他内容的模板)

尽管如此,能够直接使用模板类型还是很好的

编辑: 感谢各位,似乎修复了其他错误(后面列出的错误)后,一切都正常了。 我的原始代码中有
template
,而不是
template
,并且方法列为public。
这表明我应该在发布之前等待更长的时间。对此我深表歉意。

下面是一个完整的示例,可以编译并运行良好:

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 );
}
struct MyType
{
};
模板
阶级基础
{
公众:
虚空法(T*arg)=0;
};
类子:公共基
{
公众:
void方法(MyType*){/*blah*/};
};
int main()
{
MyType a;
儿童b;
b、 方法&a;
}

在第一行写
模板
,而不是
模板
。就这样。

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

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

为了获得期望的结果,需要将基类方法公开

   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.";
    };
};
模板类基类
{
public://公共定义很重要,否则它不会被覆盖
虚空方法(T*arg){

这段代码可能会有完全不同的错误。请发布您的实际代码,或者至少发布与您得到的错误相同的编译内容。
   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.";
    };
};