2010-08-12 93 views
1

我可以有一个typedef函数指针在这样的类:的typedef函数指针继承

template<typename T> 
class MyClass 
{ 

public: 

typedef T (*fptr)(T); 

    void doSomething(fptr my_fptr) { /*...*/ } 

}; 

,这工作得很好。但如果我从这样的类继承,如下所示:

template<typename T> 
class MyClass 
{ 

public: 

typedef T (*fptr)(T); 

    virtual void doSomething(fptr my_fptr) = 0; 

}; 

template<typename T> 
class MyOtherClass: public MyClass<T> 
{ 

public: 

    void doSomething(fptr my_fptr) { /*...*/ } 

}; 

编译器抱怨说fptr是未定义的。有没有继承这样的函数指针typedefs的方法?谢谢, james

+0

你使用什么编译器?我不会抱怨这个。 – 2010-08-12 15:02:04

+0

@Seb Rose:我猜你正在使用VS ...这是该编译器的已知问题。根据标准的代码不应该编译。 – 2010-08-12 15:07:57

+0

@dribeas - 感谢那 – 2010-08-12 15:19:52

回答

1

你应该能够继承这样的公共typedefs。

您是否尝试过这样的事情,以确保编译器知道这是一个父类型:

void doSomething(typename MyClass<T>::fptr my_fptr) { /*...*/ } 
+0

这样做了......我刚开始时错过了typename。 – 2010-08-12 15:10:52

0

我觉得编译器需要更多的信息,由于模板:

尝试 typename MyClass<T>::fptr

4

问题不在于继承,而在于模板是从另一个模板的实例继承的,通过它自己的模板参数作为参数。也就是说,它是从依赖类型继承的(MyClass<T>取决于类型T)。

该语言要求在执行类型替换之前对模板进行验证,并且在第一次传递期间,将验证所有非依赖名称。当编译器看到fptr时,它不依赖于类型T,因此它会尝试将它定位在模板外部作为名称空间级别符号并失败。不允许用类型实例化MyBase(没有替换类型),因此整个MyBase都是未知的,并且没有符号可以在那里查找(不用替换类型,编译器不知道是否存在具体专业MyBase)。

最简单的办法是增加一个本地的typedef:

typedef MyBase<T> base_type; 
typedef typename base_type::fptr fptr; 

或完全限定通话:

void doSomething(typename MyClass<T>::fptr) ... 
0

的问题是,该定义是依赖于一个模板参数的基类(被称为从属基类);直到模板实例化该基类的实际内容才知道它;不同的专业可能有不同的成员。所以,你必须明确地指出,这是一个类型,在基类中定义:

template<typename T> 
class MyOtherClass: public MyClass<T> 
{ 
    typedef typename MyClass<T>::fptr fptr; 
    // now fptr is available in this class template 
}; 

要访问相关的基类的成员,你可以把它们称为要么MyClass<T>::memberthis->member