2016-04-22 11 views
2
以下

は(何のコードが省略されていない)私のプロジェクトへの完全なコードです:マークラインでなぜコンパイラは「Static_castから関連していないもの」と言っていますか?

#include <iostream> 
#include <string> 
#include <vector> 
#include <unordered_map> 

typedef enum{ 
    MAJOR_BUTTON_IGNORED_FIRST = 0, 
    MAJOR_BUTTON_BLOCKS, 
    MAJOR_BUTTON_IGNORED_LAST, 
}MAJOR_BUTTON_TYPE; 


typedef enum{ 
    BLOCK_IGNORED_FIRST = 0, 
    BLOCK_ORDINARY_SMASHABLE, 
    BLOCK_IGNORED_LAST, 
}THING_TYPE; 

class Datar{ 
private: 
public: 

    MAJOR_BUTTON_TYPE majorType; 
    std::string majorButtonString; 
    std::vector<THING_TYPE>thingTypes; 
    std::unordered_map<THING_TYPE, std::string>thing2String; 

    Datar(){ 

    } 

    virtual ~Datar(){}; 
    virtual void initDatar(){}; 
}; 

class DatarBlock : public Datar{ 
private: 
public: 

    virtual void initDatar(){ 
     majorType = MAJOR_BUTTON_BLOCKS; 
     majorButtonString = "MajorButtonNames::blocks"; 

    } 

}; 

int main(int argc, const char * argv[]) { 
    // insert code here... 
    std::cout << "Hello, World!\n"; 
    DatarBlock* db = new DatarBlock(); 
    Datar* blah = static_cast<Datar*>(db); //Compiler error here **** 
    return 0; 
} 

、言うコンパイルエラーがあります:

main.cppに:62: 19:「DatarBlock *」から が継承によって関連していない「DATAR *」にstatic_castを、

を許可されていないのはなぜエラーとしてコンパイラのレポートそれをしませんか?

編集:私はXcodeの7.2(LLVM 7.0)を使用しています、C++標準ライブラリは= libcの++(C++ 11のサポートとLLVM標準ライブラリ)、C++言語の方言= GNU ++ 11

+2

[再生できません](http://rextester.com/TPGX82687)どのコンパイラを使用していますか? – songyuanyao

+0

@songyuanyao私はXcode 7.2(LLVM 7.0)、C++標準ライブラリ= libC++(C++ 11をサポートするLLVM標準ライブラリ)、C++言語の方言= GNU ++ 11を使用しています。 –

+1

あなたが今削除したのと同じ質問を投稿するのはなぜですか? http://stackoverflow.com/questions/36785524/why-does-the-compiler-think-that-these-two-classes-are-not-related-by-inheritanc/ –

答えて

4

このコードはでは無効です(http://en.cppreference.com/w/cpp/utility/hashを参照してください)、std::hashが列挙型に特化していない場合は、C++ 11が公開されています(DR 2148なし)。 libstdC++ 4.6で受け入れられました(私はlibc++のバージョン番号がありません)。

C++ 14件のゲイン所望の専門、彼らはGCC bug 60970DR 2148を参照のlibstdC++ 6に実装され、意図的に同様にC++ 11モードで利用可能でれるのlibstdC++ 5のように、それらが実装されていません。 を使用しているlibC++のバージョンは、でC++ 14モードでのみサポートされます。

これは、以前のエラーが完全に無意味後でエラーをレンダリングする可能性があるため、順番にすべてエラー、を見てする必要がある理由の一例です。

+1

'--std = C++ 11'のプルーフ、コンパイルは失敗しますが、' --std = C++ 14'のコンパイルは成功します。 –

+0

@ Jean-BaptisteYunèsこれはあなたの実装に非常に多くの信頼を置いています。私は標準からの証明、または少なくとも標準を参照するよう注意しているサイトを好む。 – o11c

+0

GCCのメンテナーとの議論から、DRの存在は '-std = C++ 11'モードで受け入れられるべきであることを意味します。 – o11c

関連する問題