int Sum(int a) の定義と、実装部分、それを呼び出している部分は一致してますか?
関数の戻り値や、パラメータの型及び数が、上の3つの個所で一致してますか?
// CTest3View クラスの描画
void CTest3View::OnDraw(CDC* pDC)
{
CTest3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
int q;
char b[100];
q=30;
sprintf(b,%d, Sum(q));
pDC->TextOut(10, 10, b);
}
略
// CTest3View クラスのメッセージ ハンドラ
int CTest3View::Sum(int a)
{
return(a+30);
}
これではダメなんでしょうか?
宣言していれば問題ないですね。
ごめんなさい、間違えて解決ボタン押してしまいました。
他人でも押せるんですね・・・失礼しました。
>これではダメなんでしょうか?
CStringをcharの配列に変えても、もちろん OK
でも動かないんですが先ほどのエラーがでます。
宣言していれば問題ないですね。
Test3View.h の Sumの宣言部分のコードはどうなってます?
// CTest3View クラスのメッセージ ハンドラ
int CTest3View::Sum(int a)
{
return(a+30);
}
>これではダメなんでしょうか?
「クラスのメッセージ ハンドラ と言う表現」が気になります。
メッセージ ハンドラではなくて、メンバ関数なんですが。
ClassViewのCTest3Viewを右クリックしてメンバ関数の追加で、自動で追加してくれま
す。
それを、haiさんのコードと比べてください。
あるいは、呼び出すより上に実装部分と宣言部分を兼ねて記述して、
ローカルな関数にしてもいいかと。
int Sum(int a)
{
return(a+30);
}
/////////////////////////////////////////////////////////////////////////////
// CTest3View クラスの描画
void CTest3View::OnDraw(CDC* pDC)
{
CTest3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
int q;
char b[100];
q=30;
sprintf(b,%d, Sum(q));
pDC->TextOut(10, 10, b);
}
また最初から作ってみました
その手順は
MFC AppWizard(exe)をつくり
CtttViewにsumというメンバ関数をint型でpublicを選択し作りました。
そして
// CTttView クラスのメッセージ ハンドラ
int CTttView::sum()
{
}
という画面がでてきたのでこれを
// CTttView クラスのメッセージ ハンドラ
int CTttView::sum(int a)
{
return(a+30);
}
と書きました。
次に
// CTttView クラスの描画のところで
// CTttView クラスの描画
void CTttView::OnDraw(CDC* pDC)
{
CTttDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
int q=30;
char b[100];
sprintf(b,%d,sum(q));
pDC->TextOut(100,100,b);
}
と書きました。
これでエラーが
C:\Program Files\Microsoft Visual Studio\MyProjects\ttt\tttView.cpp(63) : error
C2660: 'sum' : 関数が不正な 1 個の実引数をともなって呼び出されました。
C:\Program Files\Microsoft Visual Studio\MyProjects\ttt\tttView.cpp(112) :
error C2511: 'sum' : オーバーロードされたメンバ関数が '<Unknown>' にありません。
コードを生成中...
cl.exe の実行エラー
とでました。
長くてすみませんm(__)m
C++の基礎は学びましょう。
メンバ関数の宣言と定義が異なるのでエラーが出ているのです。
おそらく,宣言は
int CTttView::sum (void);
で,定義が
int CTttView::sum (int);
という状態なのでしょう。
CTttView.hの中から,
int sum();
または
int sum(void);
と書いてあるところを
int sum(int);
に修正すればたぶんエラーが出なくなると思います。
「CTttView.h」と言うヘッダファイルがあるはずです
その中に
class CTttView のような宣言があるはずです
そこから少し下のほうを見ると
int sum(); と成っているところありませんか
ここが間違っているんです
int sum(int);
にすればいいはずです
cppファイルの方だけ
>int CTttView::sum()
>{
>}
ここを
>int CTttView::sum(int a)
>{
と直したのが原因です
ヘッダファイルもキチンと直しましょう
>error C2511: 'sum' : オーバーロードされたメンバ関数が '<Unknown>' にありませ
>ん。
今回の場合は、
同じ名称で引数の数が違う場合
同じクラス宣言内では関数のオーバーロードが行われたものとして
コンパイラが勘違いしているメッセージのようです
つまりクラス宣言時の引数の数と実態となる関数の引数が合わないことを示しています
誰かもう少しフォローしてくれるとうれしいです
>int CTttView::sum(int a)
>{
>直したのが原因です
これはなおさなくてもよかったのでしょうか?
woodさんのアドバイスをよく読みましょう。
「.hファイルを変更せずに、cppファイルだけ変更したのがいけない。」
と言っているのです。.hファイルでの関数宣言と、.cppでの関数定義で、リターン値の
型、引数の数・型・順番は完全に一致してなくてはならないのです。
>これはなおさなくてもよかったのでしょうか?
関数に引数を与えるかどうかを決めることは、プログラムを設計する上で非常に重要な事
です。「直す必要があったかどうか」ではなく、「あなたがその関数に引数を与える必要
があると決めたかどうか」です。そんなのはあなたにしか解りません。