2012-05-17 258 views
0

我已阅读下列SO问题:呼叫派生类的静态方法

但是我有一个关于一个稍微不同的问题静态方法和Visual-C++和gcc之间的区别。

我有一个类捆绑了一些与给定任务相关的静态方法。我希望实现每种方法的简单版本,并在将来实现更高效的实施。我通过在基类中实现所有方法并从派生类调用方法来实现这一点。这样,具有“较新”实现的方法将隐藏“旧”实现。我的问题是,当一种方法g()调用另一种方法f(),我想验证派生类中的实现被调用(如果存在)。我不能使用虚拟方法,因为我的方法都是静态的。在visual-C++中,下面的代码正在做我刚刚描述的内容,但gcc不会编译 - 实际上我很惊讶visual-C++编译好了。 (我需要我的代码编译两个)

struct Base { 
    static void f() {} 
    static void g() { Derived::f(); } //--- visual-c++ compiles ok; gcc: "'Derived' was not declared in this scope" 
}; 
struct Derived : public Base { 
    static void f() {} 
}; 

Derived::g(); 

我的问题是,怎么来的视觉-C++是不是在抱怨,我怎么能解决它在海湾合作委员会没有彻底改变我的代码?

回答

0

确定这是给一个答案(和删除之前我评论的机会/接受)让我百思不得其解多么简单(或者换句话说,是多么愚蠢,我的问题是:))

所有我要做的是分开的实施声明(这是所有在一个单一的.h文件 - 坏的编码,我知道,这是一个永久的“临时”的解决方案)

struct Base { 
    static void f(); 
    static void g(); 
}; 

struct Derived : public Base { 
    static void f(); 
}; 

int main() { 
     Derived::g(); 
     return 0; 
} 

void Base::f() {} 

void Base::g() { Derived::f(); } 

void Derived::f() {} 
+0

我删除了答案,因为我很很确定Q中的代码不会在没有任何编译器扩展的情况下编译。我不知道为什么它会在MSVC中编译,也许是编译器扩展。 –

+0

我认为一般MSVC不如GCC(这不是我第一次遇到在MSCV中编译但不在GCC中的代码)。无论如何,谢谢你,你的回答让我想起了一点点,找到了一个简单的解决方案...... –