2016-10-12 15 views
0

最近、私は古典的なスネークゲームのリメイクに取り組んでいます。今回は、スネークのテールのリンクリストの代わりにデキュを採用しました。私はテールセグメントを作成し、それをデュークの前で取り除き、奇妙なエラーを取得しようとします。C++:std :: dequeへの呼び出しで一致する関数がありません<SnakePart> :: emplace_front

no matching function for call to 'std::deque<SnakePart>::emplace_front(<brace-enclosed initializer list>)'|

私はまだC++、私はこのエラーが発生している理由として無知だとかなり新しいですので。誰かが私にこの難解を解決するのを手伝ってもらえれば幸いです。

SnakePart.cpp
http://pastebin.com/verR9bpn

Snake.h
http://pastebin.com/XUyNAVKK

最小完全&検証可能例:

#include <deque> 

struct Test { 
    Test(int x, int y) : x(x), y(y){} 
    int x; 
    int y; 
}; 

int main() { 
    int x = 4, y = 5; 

    std::deque<Test> tester; 
    tester.emplace_front({x, y}); 
    return 0; 
} 

SnakePart.cpp

#include "Snake.h" 
#include <deque> 

void SnakePart::advance(int x, int y, bool loose_tail = true) { 
     parts.emplace_front({x, y}); 

     if(loose_tail) 
      parts.pop_back(); 
} 

Snake.h

#ifndef SNAKE_H_INCLUDED 
#define SNAKE_H_INCLUDED 

#include <deque> 

class SnakeHead { 
private: 
    int posX, posY; 

    // Snake head functions 
    void input(); 
    void movement(); 
}; 

class SnakePart { 
private: 
    std::deque<SnakePart> parts; 

    void advance(int x, int y, bool loose_tail); 
}; 

#endif // SNAKE_H_INCLUDED 
+3

、ソースへのリンクを投稿しないでください、コピー&ペーストを行うことができ、それが意味もコピーコンストラクタを持って

tester.emplace_front(x, y); 

を使用できることを意味2つのintの引数を取るコンストラクタを持っています質問の本文に直接ソース。 [良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)(また、[最小限で完全であり、検証可能な例](http:// stackoverflow.com/help/mcve))。 –

+0

@JoachimPileborg質問にコードを追加します –

答えて

3

emplace_front関数は引数を取り、含まれているオブジェクトの適切なコンストラクタに渡します。 Testクラスには、単一のinitializer-list引数を取るコンストラクタはありません。それはあなたが

tester.emplace_front(Test{x, y}); 
+0

素早く応答してくれてありがとう –

1

emplace_front関数のparamsから中括弧を削除します。 Semanticのemplace*は、コンテナタイプTのコンストラクタのように引数が渡されることを意味します。 {}を渡すと、引数タイプはstd::initializer_listになります。

+0

C++標準ライブラリの 'new_allocator.h'ファイルにエラーが発生します –

関連する問題