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

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

新規登録して質問してみよう
ただいま回答率
85.35%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

C++

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

Q&A

解決済

3回答

8749閲覧

"認識できない型が使われています。"のエラー対処法がわかりません。

退会済みユーザー

退会済みユーザー

総合スコア0

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

C++

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

0グッド

0クリップ

投稿2021/02/08 06:59

編集2021/02/08 07:32

前提・実現したいこと

名前空間内に静的な関数を実装したい。

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

エラー C2027 認識できない型 'TestClass3' が使われています。 エラー C2079 'a' が 未定義の class 'TestClass3' で使用しています。

該当のソースコード

TestClass2.h

C++

1#pragma once 2 3class TestClass3; 4 5class TestClass2 6{ 7 TestClass2(){}; 8 ~TestClass2(){}; 9}; 10 11namespace ts 12{ 13 //class TestClass3; 14 class tmp1 15 { 16 public: 17 tmp1() {}; 18 ~tmp1() {}; 19 20 static TestClass3 tmp3(){ TestClass3 a; return a;} 21 22 }; 23 24 25 class TestClass3 26 { 27 public: 28 TestClass3() {}; 29 ~TestClass3() {}; 30 31 static tmp1 tmp4(){ tmp1 b; return b;} 32 void Hello3(void){ TRACE("hello3 \n"); return; } 33 }; 34}

MFCApplication1Dlg.cpp

C++

1void CMFCApplication1Dlg::OnBnClickedButton1() 2{ 3 // TODO: ここにコントロール通知ハンドラー コードを追加します。 4 5 ts::TestClass3 tmp3 = ts::tmp1::tmp3(); 6 7}

試したこと

前方宣言がおかしいかと思い、namespace内に試しても同じエラーができます。
どのような検索をすれば問題解決ができるかもわからず手詰まりです。
ご教授いただけると助かります。

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

Visual studio 2017
プラットフォームツールセット:v141
MFC

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

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

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

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

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

guest

回答3

0

TestClass2.h で、
class TestCase3; は namespace ts の中に入れ、
tmp3 は次のように宣言だけにして、
static TestClass3 tmp3(); //{ TestClass3 a; return a;}

別の .cpp のファイルに次の定義を書けばよいのではありませんか?
ts::TestClass3 ts::tmp1::tmp3(){ TestClass3 a; return a;}

投稿2021/02/08 07:30

kazuma-s

総合スコア8224

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

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

0

ベストアンサー

class tmp1の中ではstatic TestClass3 tmp3();と宣言だけして、TestClass3の宣言も揃ったところで別途static TestClass3 tmp1::tmp3()の定義を行う、という方法はどうでしょうか?

投稿2021/02/08 07:27

編集2021/02/08 07:28
maisumakun

総合スコア146018

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

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

0

tmp1::tmp3() メソッドでは TestClass3 型そのものを使用しているので,
当然ながら TestClass3 とは何なのか? という定義が必要になります.
そこを前方宣言で解決することはできません.

tmp1 と TestClass3 の定義順を逆順にすれば良いように見えます.


namespace ts 内でコメントアウトされている

//class TestClass3;
の前方宣言を復活させ,
tmp1::tmp3()メソッドの実装を,class TestClass3の定義の後ろで行ってください.

を示しておく.

C++

1namespace ts 2{ 3 //tmp1::tmp3()の宣言に必要 4 class TestClass3; 5 6 class tmp1 7 { 8 //ここではTestClass3の正体が不明なので,メソッドの実装は書けない 9 static TestClass3 tmp3(); 10 }; 11 12 class TestClass3 13 { 14 static tmp1 tmp4(){ tmp1 b; return b;} 15 }; 16 17 //ここならTestClass3の定義が見えるから,メソッドの実装をここに書く 18 TestClass3 tmp1::tmp3(){ TestClass3 a; return a;} 19}

投稿2021/02/08 07:08

編集2021/02/08 07:48
fana

総合スコア11996

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

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

退会済みユーザー

退会済みユーザー

2021/02/08 07:18

ご回答いただきありがとうございます。 質問の記述が足りず申しわけありませんが、TestClass3にもstatic tmp1の変数を用いりたいのため、定義順を逆にしない方法を模索しております。
fana

2021/02/08 07:30

そのような必須の要件が全て明確な形に質問を修正してください.
fana

2021/02/08 07:38

namespace ts 内でコメントアウトされている //class TestClass3; の前方宣言を復活させ, tmp1::tmp3()メソッドの実装を,class TestClass3の定義の後ろで行ってください.
fana

2021/02/08 07:49

(404食らってる間に終わってたわ)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問