2016-06-13 4 views
0

나는 here의 트리 컨테이너 클래스를 사용하고 있습니다.템플릿 - 기본 클래스의 보호 된 typedef 액세스

Visual Studio 2013에서는 모든 것이 괜찮습니다 (하나의 사소한 수정 이후).하지만 내 응용 프로그램은 크로스 플랫폼이므로 Xcode 7.2.1 (Clang 1.0)에서 컴파일되도록 노력하고 있습니다. 모든 지옥 느슨한 휴식.

많은 오류가 있습니다. 내가보고 있었고, 추측 할 수없는 일이입니다 ..

template <typename Tree, typename Data, typename Compare> 
struct node_ordered 
: public node_base< Tree, 
        node_ordered<Tree, Data, Compare>, 
        multiset< node_ordered<Tree, Data, Compare>*, 
           ptr_less_data<Compare>, 
           typename Tree::allocator_type> 
           > 
    { 
    typedef Tree tree_type; 
    typedef typename Tree::allocator_type allocator_type; 
    typedef node_ordered<Tree, Data, Compare> node_type; 
    typedef multiset<node_type*, ptr_less_data<Compare>, allocator_type> cs_type; 
    typedef node_base<Tree, node_type, cs_type> base_type; 

    typedef typename base_type::iterator iterator; 
    typedef typename base_type::const_iterator const_iterator; 

    protected: 
    typedef typename base_type::cs_iterator cs_iterator; 
    typedef typename base_type::cs_const_iterator cs_const_iterator; 

이제 마지막 두 줄은 오류를 생성 (나는 명확성을 위해 일부 비트를 손질 한)

error: 'cs_iterator' is a protected member of 'st_tree::detail::node_base... 

cs_iterator가 해당 클래스의 보호 된 멤버이지만 클래스는 기본 클래스이므로 반드시 작동해야합니다. 그것은 Visual Studio에서하고, G ++에서 보일 것입니다. (저는이 문제를 16 번 문제와 관련하여 추론합니다).

public class node_base < ..에서 직접 기본 클래스 정의를 복사하여 붙여 넣으려고했지만 typedef에 문제가 없는지 확인하고 동일한 오류가 발생합니다.

내가 말했듯이이 코드는 Visual Studio 2013에서 올바르게 컴파일되고 작동합니다. 이제는 Xcode/Clang에 익숙해 져 있는데 Visual C++의 구문에 대해서는 다소 엄격합니다.하지만이 오류는) 나를 신비화시켜 줘.

아이디어가 있으십니까?

+0

간단한 'struct base'와'struct Derived : Base'를 사용하여 짧은 테스트 예제로 이것을 재현 할 수 있습니까? – Arunmu

답변

0

여기 내 자신의 질문에 대답하므로 사람들은 나를 도우려고 시간을 낭비하지 않습니다.

이 오류와 내가 실제로보고 있던 대부분의 오류는 빨간 청어였습니다.

저는 Visual Studio가 아닌 XCode에서 컴파일하는 데 차이가 나는 이유는 컴파일러의 차이 때문이라고 생각했습니다. (보통 이것은 범인입니다).

하지만 그것은 라이브러리의 차이로 인해 나타났습니다.

XCode는 LLVM libcxx를 사용합니다. 다른 사람이하지 않는 컴파일 시간 검사가 포함되어 있습니다. 벡터 <> 정의 예를 들어

, 우리는 개발자가 내부 값을 벡터 선언에서 트리 값 유형에 주어진 할당을 사용했다 장소가 있었다의 st_tree 컨테이너에

static_assert((is_same<typename allocator_type::value_type, value_type>::value), 
       "Allocator::value_type must be same type as value_type"); 

지금이 .

컴파일러에서 해당 static_assert 오류가 발생하면 예상했던대로 오류가 발생했지만 아주 부러진 방식으로 계속해서 오류 메시지가 표시됩니다. 이 질문을 게시하십시오.

개발자에게 코드에 대한 문제를 st_tree에게 알 렸습니다.

관련 문제