2011-01-19 10 views
0

저는 오래전에 작성된 Visual C++ (Visual Studio 7.1 버전) 및 Intel C++ 컴파일러 11.0으로 컴파일 된 C++ 코드를 포팅 해 왔으며 대상 플랫폼은 Linux입니다 (Suse x86- 64) 문제는이C++ 템플릿 클래스 상속

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(); } 
} 
같은 그 코드는 GCC 4.3.2 인텔 C++ 컴파일러 11.1

MAIN.CPP이

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

리눅스 (인텔 C++ 11.1, GCC 4.3.2)에 컴파일하지만, 완벽하게 Windows에서 컴파일하지 않습니다 (비주얼 C++ 7.1, 인텔 C++ 11.0), althow에게 그것을 확실하게 의존해서는 안 플랫폼에서. 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 인 것을 고려하면 Intel C++에 대해서는 놀랄 일이 아닙니다. – nexx

1

이것은 잘 알려진 템플릿의 문제입니다. C++ FAQ

0

컴파일러에 -fpermissive 옵션을 사용하여 gcc 4.4.1 (os는 Ubuntu) 버전에서 컴파일 오류를 컴파일 경고로 바꿀 수있었습니다.

편집 : 일부 컴파일러가이를 수락한다는 사실은 향후 버전에서도 계속 수용 할 수 있음을 의미하지는 않습니다.

+0

변경되면 고객의 코드 기반이 깨질 것이라는 점을 제외하면 . 그래서 우리는 시각적 인 C++의 느슨한 행동에 매달 렸습니다./W4를 사용하면 경고를받습니다. –