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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

861閲覧

C++で関数のポインタからファンクタに置き換えたい

Sme

総合スコア30

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/05/11 11:01

前提・実現したいこと

SFML2.4 非公式日本語翻訳
ここのウェブページに書いてあった"共有しているデータを保護する"
の項のプログラムをファンクタを使って練習の為書き直そうとした所上手く行きませんでした。
(ファンクタ自体このサイトを見て知った初心者です)

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

main.cpp(7): error C2091: 関数は関数を返せません。

該当のソースコード

C++

1#include <SFML/System.hpp> 2#include <iostream> 3 4// ミューテックスオブジェクトを宣言 5sf::Mutex mutex; 6struct func { 7 void operater()() { 8 mutex.lock(); // ロック 9 10 for (int i = 0; i < 10; ++i) { 11 std::cout << "I'm thread number one" << std::endl; 12 } 13 14 mutex.unlock(); // ロック解除 15 } 16}; 17 18int main() 19{ 20 sf::Thread thread((func())); 21 thread.launch(); 22 23 mutex.lock(); // ロック 24 25 for (int i = 0; i < 10; ++i) { 26 std::cout << "I'm the main thread" << std::endl; 27 } 28 29 mutex.unlock(); // ロック解除 30 31 return 0; 32}

試したこと

main関数1行目のthread()の引数をfunc()から(func())に変更したところ、

main.cpp(21): error C2228: '.launch' の左側はクラス、構造体、共用体でなければなりません

という発生していたエラーは解決しました。
しかし、どの記述が関数が関数を返す形になっているか検討も着かないです…

補足情報(FW/ツールのバージョンなど)

SFML-2.5.0 Visual C++ 15 (2017) - 32-bit
Microsoft Visual Stadio 2017

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

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

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

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

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

guest

回答1

0

ベストアンサー

operater → operator です。


(以下、勘違いの回答でした。)
C++11以降に対応したC++コンパイラであれば下記コードで期待通り動きます。

c++

1sf::Thread thread{func()};

投稿2018/05/11 11:24

編集2018/05/11 11:28
yohhoy

総合スコア6191

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

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

Sme

2018/05/11 11:31 編集

下は勘違いでコピペしたら main.cpp(7): error C2091: 関数は関数を返せません。 のみになりました。混乱防止のため残しておきます、申し訳ないです ------------- main.cpp(7): error C2091: 関数は関数を返せません。 main.cpp(20): error C2059: 構文エラー: '}' main.cpp(20): error C2143: 構文エラー: ';' が '}' の前にありません。 main.cpp(20): error C2143: 構文エラー: ')' が ';' の前にありません。 main.cpp(21): error C3927: '->': 後続の戻り値の型は、関数以外の宣言の後に許可されていません main.cpp(21): error C3484: 構文エラー: 戻り値の型の前に '->' が必要です main.cpp(21): error C3613: '->' の後に戻り型が指定されていません ('int' と見なされます) main.cpp(21): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません main.cpp(21): error C2146: 構文エラー: ';' が、識別子 'launch' の前に必要です。 main.cpp(23): error C3927: '->': 後続の戻り値の型は、関数以外の宣言の後に許可されていません main.cpp(23): error C3484: 構文エラー: 戻り値の型の前に '->' が必要です main.cpp(23): error C3613: '->' の後に戻り型が指定されていません ('int' と見なされます) main.cpp(23): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません main.cpp(23): error C2371: 'mutex': 再定義されています。異なる基本型です。 main.cpp(5): note: 'mutex' の宣言を確認してください main.cpp(23): error C2146: 構文エラー: ';' が、識別子 'lock' の前に必要です。 main.cpp(25): error C2059: 構文エラー: 'for' main.cpp(25): error C2143: 構文エラー: ')' が ';' の前にありません。 main.cpp(25): error C2143: 構文エラー: ';' が '<' の前にありません。 main.cpp(25): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません main.cpp(25): error C2059: 構文エラー: '++' main.cpp(25): error C2059: 構文エラー: ')' main.cpp(25): error C2143: 構文エラー: ';' が '{' の前にありません。 main.cpp(25): error C2447: '{': 対応する関数ヘッダーがありません (旧形式の仮引数リスト?) main.cpp(29): error C3927: '->': 後続の戻り値の型は、関数以外の宣言の後に許可されていません main.cpp(29): error C3484: 構文エラー: 戻り値の型の前に '->' が必要です main.cpp(29): error C3613: '->' の後に戻り型が指定されていません ('int' と見なされます) main.cpp(29): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません main.cpp(29): error C2371: 'mutex': 再定義されています。異なる基本型です。 main.cpp(5): note: 'mutex' の宣言を確認してください main.cpp(29): error C2146: 構文エラー: ';' が、識別子 'unlock' の前に必要です。 main.cpp(31): error C2059: 構文エラー: 'return' main.cpp(32): error C2059: 構文エラー: '}' main.cpp(32): error C2143: 構文エラー: ';' が '}' の前にありません。 修正してみた結果恐ろしい量のエラーが出てきました…
Sme

2018/05/11 11:34

無事ファンクタで挙動しました。 お手数おかけしましたが、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問