2016-06-13 6 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; 

今すぐ最後の2行がエラーを発生させる(私は明確にするため、いくつかのビットをトリミングしました)

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

cs_iteratorはそのクラスの保護されたメンバーですが、そのクラスは基本クラスなので、確かに動作するはずです。それはVisual Studioで行い、G ++のように見えます(問題#16に関するコメントから推測します)。

基本クラスの定義を:public node_base < ..から直接コピーして貼り付けようとしましたが、typedefの問題ではないことを確認するために同じエラーが発生します。

私が言ったように、このコードはVisual Studio 2013でコンパイルされ、うまく動作します。今ではVisual C++の文法についてかなり厳しいですが、Xcode/Clangに慣れてきましたが、私に神秘を抱かせてください。

アイデア?

+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にコードに関する問題を通知しました。

関連する問題