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

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

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

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

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

Q&A

解決済

1回答

1624閲覧

関数オブジェクトの実装にautoを使用するとエラーになる

JADEN

総合スコア106

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

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

0グッド

0クリップ

投稿2016/04/28 12:55

以下のコードで、main関数の c(); でエラーになります。
C::operator()() constをインラインにすると、エラーは消えます。
なぜ、エラーになるのでしょうか。

コンパイラ: MSVC

C++

1#ifndef SUB_H 2#define SUB_H 3 4class C { 5public: 6 auto operator()() const; 7}; 8 9#endif

C++

1#include "sub.h" 2 3auto C::operator()() const { 4 return 0; 5}

C++

1#include "sub.h" 2 3int main() { 4 C c; 5 c(); 6}

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

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

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

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

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

guest

回答1

0

ベストアンサー

C++ではソースコードはファイル単位でコンパイルされるため、あるソースファイルをプリプロセッサが展開した時点でそのファイルだけで全ての型が決定できる必要があります。
しかし、sub.hはmainのあるソースコードにプリプロセッサで展開すると

C++

1class C { 2public: 3 auto operator()() const; 4}; 5 6int main() { 7 C c; 8 c(); 9}

となり、operator()の戻り値の型は決定できずエラーになります。
インラインにすると

C++

1class C { 2public: 3 auto operator()() const 4 { 5 return 0; 6 } 7}; 8 9int main() { 10 C c; 11 c(); 12}

ですからreturn 0 から 戻り値の型はintに決定できるのでコンパイルできます。
複数のソースに分かれている内容がくっつくのはそれぞれのコンパイルが終わってリンクをする段階なのでコンパイラは別のソースコードから型を決定できないのです。

投稿2016/04/28 14:25

編集2016/04/28 17:13
toki_td

総合スコア2850

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

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

JADEN

2016/04/29 07:48

回答ありがとうございます。 メンバ関数の戻り値としては、あまり使用されない訳ですね。
episteme

2016/04/30 10:32

戻り型が決まってりゃいいんだから auto operator()() -> int const; なら通りそう。
episteme

2016/04/30 13:26

っと、コッチ↓が正解か。 auto operator()() const -> int;
yumetodo

2016/05/01 04:59

それはC++14の関数の戻り値の型推定ではなくC++11の戻り値の型の後置記法では。
JADEN

2016/05/01 09:15

>>epistemeさん 推論をしたいので、yumetodoさんの返信通りです。
episteme

2016/05/03 09:50

でしたら関数の定義がないと(コンパイル単位内で定義が見つからないと)推論のしようがありませんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問