C++ C++;模板继承
编辑:这只是另一个案例“愚蠢而无趣的错误”。您已被警告:) 有件事让我彻夜未眠。也许有较高C++知识的人可以找到如何工作:< /P>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*/ }; }; 模板 阶级基础 {
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.";
};
};