質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

1838閲覧

構造体ネストの宣言時のエラー(C++)

puroguraman

総合スコア20

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2021/08/07 20:30

編集2021/08/08 07:14

ヘッダーファイルに下のように構造体のネストを宣言したところ、エラーがでました。
いろいろ調べたのですがわからず、解決方法を教えて頂きたいです。
開発環境はvisual stduio 2019です。

c++

1typedef struct { 2 3 int num1; 4 5 int num2; 6 7}POLYGON_DATA; 8 9//面頂点データセット 10struct VERTEX_DATA { 11 12 float V_0[5], V_1[5], V_2[5], V_3[5]; 13 14}; 15 16 17struct REGISTER_DATA { 18 19 POLYGON_DATA model_data; 20 21 std::vector<VERTEX_DATA> surface_data; 22 23};

エラー C2664 'REGISTER_DATA::REGISTER_DATA(REGISTER_DATA &&)': 引数 1 を 'POLYGON_DATA' から 'const REGISTER_DATA &' へ変換できません。

このエラーをクリックするとxmemoryというファイルに飛ばされ下記の部分が指摘されます。

::new (const_cast<void*>(static_cast<const volatile void*>(_Ptr))) _Objty(_STD forward<_Types>(_Args)...);

xmemoryは自分では作っておらずこういうエラーははじめてです。いろいろ調べましたが知恵を貸していただきたくお願いいたします。

修正依頼いただき、出力タブのうち自分が書いた部分に飛ばされた部分を記載します。

1>C:\略\Visual Studio 2019\Dll1\Dll1\Header.h(128,1): message : 'REGISTER_DATA::REGISTER_DATA' の宣言を確認してください

インクルードガード?構造体宣言の名前が変?などなど考えました、
例えば下記のように同じ構造をとってもエラーにはなりませんでした。

struct A{ int a; }; struct B{ A aa; };

actorbug様からのご指摘を受け、コードを最小に削除していった結果、下記の⇒部の記述を消すことでエラーを回避できますが、
本コードはDLLファイルのうち外部(C#フォームアプリ)から使う関数で消したくない内容です。

C++

1//ヘッダファイル側 2namespace Tips_Win32DLL 3{ 4 bool __stdcall DrawSpace(HDC hDC, HWND hWnd); 5 6 ⇒bool __stdcall polygon_model_add(POLYGON_DATA* _data); 7 ⇒bool __stdcall polygon_model_edi(int edi_num, POLYGON_DATA* _data); 8 ⇒bool __stdcall polygon_model_del(int delete_num); 9 10 ⇒bool __stdcall ray_model_add(RAY_DATA* _data); 11 ⇒bool __stdcall ray_model_edi(int edi_num, RAY_DATA* _data); 12 ⇒bool __stdcall ray_model_del(int delete_num); 13 14} 15 16//cppファイル側 17namespace Tips_Win32DLL 18{ 19 20 //バッファ 21 POLYGON_DATA poly_buff; 22 RAY_DATA ray_buff; 23 24 bool __stdcall DrawSpace(HDC hDC, HWND hWnd) 25 { 26     //略 27 } 28 29 //ポリゴンモデル追加 30 bool __stdcall polygon_model_add(POLYGON_DATA* _data) 31 { 32 //フォーム間データ(構造体引数)を単体データとしてバッファに代入 33 poly_buff = *_data; 34 35 //buffを末尾に追加 36 regi_data.emplace_back(poly_buff); 37 38 //表示実験、座標計算格納 39 polygon_vertex_test(regi_data.size() - 1); 40 41 return true; 42 } 43 44 //ポリゴンモデル編集 45 bool __stdcall polygon_model_edi(int edi_num, POLYGON_DATA* _data) 46 { 47 poly_buff = *_data; 48 49 //buffを代入操作 50 regi_data[edi_num].model_data = poly_buff; 51 52 //表示実験、座標計算格納 53 polygon_vertex_test(edi_num); 54 55 return true; 56 } 57 58 //ポリゴンモデル削除 59 bool __stdcall polygon_model_del(int delete_num) 60 { 61 regi_data.erase(regi_data.begin() + (delete_num-1)); 62 63 return true; 64 } 65

DLLの宣言の仕方が悪いのかなと思います。ネットで調べまくっていますが、まずは上記の結果取り急ぎ展開します。
ご指摘いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

actorbug

2021/08/07 21:36

エラーは「エラー一覧」タブではなく「出力」タブで確認してください。 「出力」タブなら、エラーが出るまでの経路にあるソースコードのパスすべてが表示されるはずなので、 その中に自分で書いたソースコードが無いか確認してください。 その行をダブルクリックすれば、該当行に飛べるはずです。
Serbonis

2021/08/08 03:15

エラーが出ているのは宣言そのものではなく、実際に変数定義しているところではないでしょうか?該当箇所のコードも提示されるとよいかも知れません。
actorbug

2021/08/08 03:43

まず前提として、ご提示のコードに空のmainを追加して同じ環境でコンパイルしてもエラーになりません。 つまり、原因はこの構造体を使用している箇所にある可能性が高いです。 現状のコードを少しずつ削っていくなどして、現象を再現するためのミニマムなプログラムを作ることはできないでしょうか。 また、「出力」タブに出ているエラーの内容を、質問にそのまま貼り付けるのも助けになるかもしれません。
Serbonis

2021/08/08 08:07

regi_dataはコンテナと思いますが、保持する要素の型も記載されると良いかと思います。 regi_data.emplace_back(poly_buff);を見ると要素の型はPOLYGON_DATAのような気もするのですが、regi_data[edi_num].model_data = poly_buff;を見るとそうでないようにも見えます。
guest

回答1

0

ベストアンサー

原因は、polygon_model_add内の以下の行だと思われます。

C++

1regi_data.emplace_back(poly_buff);

ソースにはありませんが、使用箇所から考えるとregi_dataの型はstd::vector<REGISTER_DATA>だと思われます。
そして、emplace_backの引数としてPOLYGON_DATA型のpoly_buffが渡されていますが、REGISTER_DATAにはPOLYGON_DATAを引数にとるコンストラクタが無いのでエラーになっています。

そのようなコンストラクタを作成するか、それが面倒ならREGISTER_DATA型の一時オブジェクトを作って渡しましょう。

C++

1regi_data.emplace_back(REGISTER_DATA{ poly_buff });

ただ、一時オブジェクトを作るとemplace_backの利点がなくなるので、push_backにして型名を省略するほうが短くて良いかもしれません。

C++

1regi_data.push_back({ poly_buff });

あと、こちらで確認した限りでは、「出力」タブに上記ソースのエラー箇所を示すメッセージが出ていました。
そちらで同じメッセージが出ていないか確認をお願いします。

text

1xxx.cpp(71): message : コンパイル対象の関数 テンプレート インスタンス化 '_Ty &std::vector<_Ty,std::allocator<_Ty>>::emplace_back<POLYGON_DATA&>(POLYGON_DATA &)' のリファレンスを確認してください

投稿2021/08/08 07:47

編集2021/08/08 08:13
actorbug

総合スコア2224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

puroguraman

2021/08/08 10:56

actorbug様 詳細なご回答ご対応まことにありがとうございます。 提示しているエラーメッセージはこちらでは出ませんでした。 DLLは無事パスが通りましたがC#側を起動すると vector subscript out of range とどこかのコードでvectorの範囲外を参照しているようでした。 どうしても解決できなければまたお世話になります。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問