2012-03-14 29 views
0

我试图建立在HP-UX 11.11这个合法的C++代码,使用HP C/aC++编译版本A.03.85:HP-UX C/aC++编译错误使用,语句纯虚方法

class BaseClass 
{ 
public: 

    virtual int sum(int i) = 0; 
}; 

class Derived : public BaseClass 
{ 
public: 

    using BaseClass::sum; 
    virtual int sum(int i1, int i2) = 0; 
}; 

class Impl : public Derived 
{ 
public: 
    virtual int sum(int i) { return i+1; } 
    virtual int sum(int i1, int i2) { return i1+i2; } 
}; 

int main() 
{ 
    Derived * obj = new Impl; 
    obj->sum(5); 
    delete obj; 
} 

然而,它失败,出现以下编译错误:

Error 181: "test_using.cpp", line 26 # Expected 2 argument(s) for "int Derived::sum(int,int)"; had 1 instead. 
     obj->sum(5); 
     ^^^^^^^^^^^ 

我能够准确地建立在其他平台,如Linux,AIX和Windows相同的代码没有任何问题。 HP的问题似乎与纯虚拟方法有关,因为如果我从“BaseClass”中删除“= 0”片段,则所有内容都按预期工作。

所以,我的问题是:你们有没有遇到过类似的问题?你是如何解决它的?这是一个知道aC++的错误?

请注意,我不能将纯粹的虚拟方法变成常规方法。

+0

无关您的问题,但你需要一个虚拟的析构函数。 – ildjarn 2012-03-14 21:59:26

+0

'#ifdef USING_HP_BUGWARE obj-> sum(5,0); #else obj-> sum(5); #endif' – JimR 2012-03-14 23:06:08

+0

@JimR你可能是指'obj-> sum(5,1​​)':) – 2012-03-15 00:37:34

回答

0
class Derived : public BaseClass 
{ 
public: 
    virtual int sum(int i) = 0; 
    virtual int sum(int i1, int i2) = 0; 
}; 

或者,如果你想更好的文件,为什么你所做的更改,哪些代码应该是:

class Derived : public BaseClass 
{ 
public: 

# ifdef USING_HP_BUGWARE 
    virtual int sum(int i) = 0; 
# else 
    using BaseClass::sum; 
# endif 

    virtual int sum(int i1, int i2) = 0; 
}; 
+0

Thanks @ bames53,I希望能在新的编译器版本/补丁中找到修复这个bug的方法,但不幸的是,情况并非如此。我认为现在我可以做的最好的事情就是采用您提出的解决方案,谢谢! – 2012-03-15 15:49:42