2010-12-11 11 views
4

현재 G ++ 및 VC++ 2010 모두 상속되는 생성자를 지원하지 않습니다.상속하는 생성자가 기존의 모든 C++ 컴파일러에서 지원되지 않는 이유는 무엇입니까?

그러나 이것은 C++ 0x에서 가장 아름다운 기능 중 하나라고 생각합니다. 그리고 저는 컴파일러에 의해 구현하는 것이 다소 쉬워야한다고 생각합니다.

컴파일러가이 기능에 관심이없는 이유는 무엇입니까?

내가이 같은 표준 : : 문자열을 상속하여 내 자신의 문자열 클래스를 설계 할 가정 :

class MyString : public std::string 
{ 
public: 
// I have to redefine many overloaded ctors here and forward their arguments to 
// std::string's ctors. How tedious it will be!!! 
}; 

아름다운 코드 예제 :

struct B1 
{ 
    B1(char); 
}; 

struct B2 
{ 
    B2(double); 
    B2(int); 
}; 

struct D1 : B1, B2 
{ 
    using B1::B1; // D1(char) 
    using B2::B2; // D1(double), D1(int) 
}; 

D1 d('c'); //OK, invokes D1(char) 
+0

"아름다운 코드 예제"의 문제점 : D1의 B2 부분이 어떻게 초기화됩니까? – UncleBens

+0

@UncleBens, 나는 이것이 기본 초기화되거나 초기화되지 않아야한다고 생각합니다. – xmllmx

+0

'std :: string'은 (또는 다른 STL 컨테이너에서 파생 된 것이 아닙니다.) – fredoverflow

답변

6

C++ 0x에는 많은 새로운 자료가 있으며, gcc에서 일하는 자원 봉사자가 다른 변경 사항을 먼저 발견하여 재미있게 처리 한 것 같습니다.

VC++의 경우 작업의 우선 순위뿐만 아니라 판매되는 제품의 필수 부분 인 요구 사항, 설명서 및 매우 광범위한 테스트에 대한 추가 비용 (종종 Microsoft 제품 관리자 블로그에서 언급 됨) 단지 그것을 작동시키는 것 이상으로.

마지막으로 it sounds like there was recent discussion among the C++0x committee about cutting this feature입니다. 유스 케이스의 95 %와 같은 간단한 해결 방법이 있기 때문입니다.

컴파일러 엔지니어가 나중에이 코드를 저장한다는 사실에 놀라지 않습니다.

0

편집진 만의 기능을 구현합니다 특정 언어 버전. 컴파일러가 C++ 0x를 지원한다고 말하면서 모든 기능을 지원하지 않는다면, 컴파일러의 오류입니다. 더 나은 컴파일러를 사용하십시오.

당신이 아직 언급 한 컴파일러에서 C++ 0x가 구현되지 않았다고 생각합니다.

+1

현재로서는 전체 C++ 0x 기능 세트를 합리적으로 구현하는 컴파일러가 없습니다. 게다가 C++ 0x 표준은 아직 완성되지 않았습니다. 그들은 점차적으로 배포되고 있습니다. –

2

아직이 기능을 사용하지 않는 구체적인 근거를 찾지 못할 것으로 생각됩니다. 일반적으로 C++ 0x에는 다른 많은 것들이 있지만 컴파일러는 일반적으로 언어 기능보다 라이브러리 기능을 구현하는 것이 훨씬 더 열심입니다. 특히 표준이 아직 완료되지 않았고 언어 기능이 변경 될 수 있습니다.

+1

반대로, 언어 변경이있을 때까지는 많은 라이브러리 변경 *을 수행 할 수 없습니다. 언어 기능이 변경되면 라이브러리도 변경해야합니다. –

2
  1. C++ 0x는 아직 표준이 아닙니다.
  2. 구현할 시간이 부족합니다.
  3. 당신이 생각하는 것처럼 그렇게 간단하지 않습니다. 이 생성자를 호출하는 것만으로는 충분하지 않습니다. 컴파일러는 파생 클래스의 멤버를 초기화하기 위해 파생 클래스에 적절한 생성자를 생성해야합니다.
0

2012 년 3 월이지만 아직 컴파일러가 지원되지 않습니다.

variadic 템플릿 생성자는 기본 클래스 생성자를 멋지게 감쌀 수 있으며 특정 ctors를 재정 의하여 부팅 할 수 있습니다. 이것은 다중 상속 예제에서 잘 작동하지 않을 수 있습니다.

class MyString: public std::string 
{ 
public: 
    template<class ...Args> 
    MyString(Args... args): std::string(args...){} 
}; 
+0

Duh, Ben의 대답은 이미이 솔루션에 연결되어 있습니다. 이중화에 대한 사과. – goertzenator

관련 문제