2011-01-19 76 views
0

私は長い時間前に書かれたVisual C++(Visual Studio 7.1バージョン)とインテルC++コンパイラ11.0でコンパイルされたC++コードを移植しています。ターゲットプラットフォームはLinux(Suse x86- 64)、GCC 4.3.2インテルC++コンパイラー11.1C++テンプレートクラスの継承

の問題点は、この

ようなそのコードされFileA.h

template<typename T, int dim> 
class A 
{ 
public: 
    A(){}; 
    ~A(){}; 
protected: 
    void foo1(){}; 
} 

FileB.h

#include "FileA.h" 
template<typename T> 
class B : public A<T, 2> 
{ 
public: 
    B(){}; 
    ~B(){}; 
    void foo(){ foo1(); } 
} 

main.cppに、それは確かに依存してはいけませんalthow

#include "FileB.h" 
int main() 
{ 
B<float> b = B<float>(); 
} 

は、Linuxの(インテルC++ 11.1、GCC 4.3.2)でコンパイルが、完全にWindowsの(のVisual C++ 7.1、インテルC++ 11.0)にコンパイルされませんプラットフォーム上。 GCCは、foo1()をfoo1(T a)に変更すると動作しますが、コードを変更することはできません。また、最終リリースにはIntel C++を使用する必要があります。

アドバイスをお寄せいただければ幸いです。

答えて

2

foo1は従属型ではないため、従属型の基本クラスはfoo1呼び出しを解決するために使用されません。

コードを変更できないので、あなたは詰め込まれています。コードを変更できる場合は、式を依存するように変更する必要があります。通常、これはthis->foo1()に変更することで行われます。

+0

はい、その作業は、ありがとうございます。 Windows上のVisual C++とIntel C++ 11.0でこのコードがうまくいかない理由はまだありますか? – nexx

+1

@nexx:Visual C++は従属名に悪名高いものです。これは**標準ではありません**と**変化する可能性はありません**。 'typename'を忘れたり、従属関数呼び出しを明示的に修飾することを忘れてしまい、うまく動作しません。 –

+0

Visual C++(7.1)が標準外であることに驚くことはありませんが、Windowsバージョンが11.0、Linusバージョンが11.1であることを考慮して、インテルC++についてもっと驚いています。 – nexx

1

これはテンプレートに関するよくある問題です。 C++ FAQ

0

gcc 4.4.1(osはUbuntu)バージョンでコンパイルエラーをコンパイル警告にするには、-fpermissiveオプションをコンパイラに使用します。

編集:一部のコンパイラがそれを受け入れるということは、それが将来のバージョンで受け入れ続けることを意味するものではありません。

+0

変更された場合、 。だから私たちは視覚的なC++のlaxistの振る舞いにこだわっています。/W4を使用すると、警告が表示されます。 –

関連する問題