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

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

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

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

Visual Studio

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

Boost

Boost (ブースト)は、C++の先駆的な開発者のコミュニティ、 またそのコミュニティによって公開されているオープンソースライブラリのことを指します。

Q&A

1回答

774閲覧

Visual Studio Community 2022でboost::assign::list_ofがコンパイルエラーになる

kamozaka

総合スコア12

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

Visual Studio

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

Boost

Boost (ブースト)は、C++の先駆的な開発者のコミュニティ、 またそのコミュニティによって公開されているオープンソースライブラリのことを指します。

1グッド

0クリップ

投稿2023/06/02 07:18

編集2023/06/02 10:09

実現したいこと

過去のVisual Studio(恐らくVisual Studio 2005 Express Edition)でコンパイルできていた「boost::assign::list_ofを使ったコード」が、Visual Studio Community 2022でコンパイル不可能になっていたので、解決策を知りたいです。

発生している問題・エラーメッセージ

下記のテストコードではvectorを対象コンテナにしていますが、実際のコードではlist, setを使用しており、それらにも対応する必要があります。

VC++

1#include <vector> 2#include <boost/assign.hpp> 3 4int main() 5{ 6 // OK 7 // 初期化の形になっていれば問題ない。 8 { 9 std::vector< long > v = boost::assign::list_of( 1 )( 2 )( 3 ); 10 } 11 12 // NG1 13 // 初期化の形になっていない場合は、下記のようなエラーが発生するようになった。 14 { 15 std::vector< long > v; 16 v = boost::assign::list_of( 1 )( 2 )( 3 ); 17 // エラー (アクティブ) E0350 複数の演算子 "=" がこれらのオペランドと一致します 18 // エラー C2593 '演算子 =' があいまいです 19 } 20 // NG2 21 // キャスト演算子で型を明示できないか?とダメ元で試したが失敗。 22 { 23 typedef std::vector< long > V; 24 V v; 25 26 v = ( V ) boost::assign::list_of( 1 )( 2 )( 3 ); 27 // エラー C2440 '型キャスト': 'boost::assign_detail::generic_list<int>' から 'V' に変換できません。 28 //message : コンストラクターはソース型を持てません、またはコンストラクターのオーバーロードの解決があいまいです。 29 30 v = static_cast< V >( boost::assign::list_of( 1 )( 2 )( 3 ) ); 31 // エラー C2440 'static_cast': 'boost::assign_detail::generic_list<int>' から 'V' に変換できません。 32 // message : コンストラクターはソース型を持てません、またはコンストラクターのオーバーロードの解決があいまいです。 33 34 } 35

初期化の形に直せる所はそれで済むのですが、直せない場合(つまり、既存のインスタンスにlist_ofで代入を行う場合)にどうしたら良いのかが不明です。
その場合はlist_ofの使用をやめるしかないのでしょうか?

試したこと

・上記ソースの通り、型の明示を試みましたがダメでした。
・Boostの1.59、1.82(最新)の2バージョンで試しましたが、結果は同じでした。
・構成「x86」「x64」の両方で試しましたが、結果は同じでした。
・「C2593 boost::assign」「"C2593" "boost" "assign"」などでググってみましたが、解決に至りませんでした。
「VSC2022+boost」の組み合わせなら必ず起こる現象であるのなら、ネット上に情報はありそうなものですが…私が何か見落としているのでしょうか。

追記

epistemeさんから頂いた回答のおかげで、C++の他の機能による代替手段を使うことにより暫定的に解決しました。
但し元々の「list_ofでエラーが生じるようになったのは何故か」という点については未解決なので、解決済みにはせず、回答が得られることにやんわりと期待したいと思います。

ttactを押しています

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

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

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

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

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

episteme

2023/06/02 14:03 編集

> 「list_ofでエラーが生じるようになったのは何故か」 [ご参考] Boost 1.82 + Visual Studio 2022 Version 17.6.2 では 提示されたコードを(warning/errorなしに)するっと通してくれました。
kamozaka

2023/06/02 22:11

おぉ、わざわざ試して頂きありがとうございます。 なんと…そうなのですか。 私の方もバージョン情報を確認したところ Microsoft Visual Studio Community 2022 (64 ビット) - Current Version 17.6.0 でした。そして、17.6.2にバージョンアップしてみましたが、結果は変わりませんでした。 Boostのバージョンは1.82なので同じです。 他には何が違うのでしょうね…。 Communityと有償版でコンパイラが違うなんてことがあるのでしょうか。 ちなみにビルドだけでなく実行も可能でしょうか? というのは、原因がよく分からないのですが、エラーが出ている状況にも関わらず 「エラー一覧」タブにエラーが表示されないことがあったからです。 (リビルドではない差分ビルドの場合に発生しやすい…ような気がする。) この場合でも実行すると「ビルドエラーが発生しました」となるので、実行まですれば確実です。 なお「エラー一覧」の設定は「ビルドのみ」にしてあるので、 「IntelliSenseでしか出ないエラー」を本当のエラーと誤認している訳でもありません。
episteme

2023/06/03 00:20

僕とこも Community やから処理系の相違はなさげ。 実行も問題なし。
kamozaka

2023/06/03 00:29

うーん、そうですか。現状では手掛かりがなさそうですね。 ともあれ、お付き合い頂きありがとうございました。
guest

回答1

0

std::vector< long > v;
v.assign({1,2,3});

で十分だと思うのだけど、boost::assign::list_of の使用は必須ですか?

投稿2023/06/02 08:20

episteme

総合スコア16614

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

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

kamozaka

2023/06/02 09:35

回答ありがとうございます。 すみません、上記のテストコードに語弊がありました。 list_ofは色々なコンテナに使用可能なので、深く考えずにとりあえずvectorでテストしてしまいましたが、 本番コードで私が使っていたコンテナはsetとlistでした。 さて、頂いた提案は、list_ofの問題はさておいて、代替手段を考えるという方向性ですね。 私はブランク明け直後のプログラマでして、vector::assignについて知らなかったので調べました。 vector::assign - cpprefjp C++日本語リファレンス https://cpprefjp.github.io/reference/vector/vector/assign.html なるほど、今のバージョンのC++では既に代替手段があるのですね。 対象コンテナがvectorであれば、確かにそれで良さそうです。 同様に、listの場合もlist::assignが使えることを確認できました。 list::assign - cpprefjp C++日本語リファレンス https://cpprefjp.github.io/reference/list/list/assign.html ではsetはどうすれば?と思いましたが、 set - cpprefjp C++日本語リファレンス https://cpprefjp.github.io/reference/set.html にinitializer_listが載っていたので試した所、今回の用途に使用できることを確認できました。 例:  std::set< long > a;  a = { 3, 1, 2 }; これで、少なくとも「今回使用しているケース全てについては」解決しました。 > boost::assign::list_of の使用は必須ですか? 「従来であればlist_ofを使いたくなる全てのケース」に対して代替手段があるのであれば、それでも大きな支障はありません。 ただ、list_ofは色々なコンテナに対して区別なく使えることがメリットだったので、 「コンテナによって手段を使い分ける」ことにするのであれば、そのメリットが失われ、少し不便になってしまいますね。 list_ofのエラーの原因自体も気になることですし、できればまた使用可能にしたい所です。 (今回、C++の新しい機能を使ってみたら、それはそれでスマートに書けて楽しかったので、満足してしまうかも知れませんが…。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問