この人頭いいなと思ったエピソード

Visual Studio 2010 professional でstrcpy_s()関数を使用しようとしているのですが,
error C2660: 'strcpy_s' : 関数に 2 個の引数を指定できません。とエラーが出てしまいます.

実際のコードでは以下のように記述しています.
strcpy_s(logfont.lfFaceName, cFontName);

具体的に取った行動は#include <string.h>を親クラスだけでなく子クラスでも宣言しました.しかし,インテリセンスも出ないためオーバーロードした関数の選択も出来ません.常に引数が3個の関数を勝手に呼び出そうとしてエラーが出ます.

Visual Studio 2010 prfessionalにおいて引数が2つのstrcpy_s()関数を呼び出すためにはどうすればよろしいでしょうか.

私の知識と技術では解決することができないため,みなさんのお知恵を拝借できないでしょうか.

開発環境

Windows 7(32bit版)
Visual Studio 2010 professional

A 回答 (6件)

他の回答者さんはcharとwchar_tの違いを指摘していますが、エラーの内容が「引数が2つのstrcpy_s関数が無い」という内容なので、観点が違うかと・・・



string.hをインクルードする前に、以下のdefineをしているかどうか確認してください。

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1

これでオーバーロードが有効になり、引数が2つでもエラーにならないはずです。詳細は参考URLにて・・・

参考URL:http://msdn.microsoft.com/ja-jp/library/ms175759 …
    • good
    • 0
この回答へのお礼

まさしくreset_catさんのおっしゃるとおりでした.
おかげさまで無事解決することが出来ました.
defineしないといけないとか夢にも思いませんでした.今後,同じ問題を抱えた人がここを見て参考にしてもらえたらいいなと思います.

本当にありがとうございました.

お礼日時:2010/06/23 02:17

実際にVS2010で試してみました。


Win32プロジェクトを新規で作成し、_tWinMainの中にコードを記述しました。

strcpy_sだと、error C2660のほかに「IntelliSense: オーバーロードされた関数"strcpy_s"のインスタンスが引数リストと一致しません」が表示されます。
_tcscpy_sに変更したところ、エラーなくコンパイルできました。

MSDNの説明にあるように、_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMESは規定で1(有効)なので、記述の必要はないようです。
    • good
    • 0

>logfont.lfFaceName


および
>cFontName
はchar型の配列になっていますか?
引数が2つの_strcpy_sはどちらもchar型配列のときに使える関数です。
(C++のtemplateで配列引数を吸収できる。)

他の方もおっしゃっていますが、「Unicode文字セットを使用する」のコンパイルオプションですと
>logfont
が LONGFONT構造体の変数と仮定すると

LONGFONT logfont;

という宣言では、lfFaceNameメンバ変数がwchar_t型の配列になります。

本当にstrcpy_sを使うのであれば、

LOGFONTA logfont;

として、CreateFontIndirectAあたりでフォントを作成してください。
まぁ、やらないでしょうが。


ちなみに、自分だったら警告消すために_tcscpy_sをつかうのもなぁ、
バッファオーバーランも確実に起こらないし、というときは API の lstrcpy を使っちゃいます。
    • good
    • 0

> _tcscopy_sまたはwcscopy_s



_tcscpy_sまたはwcscpy_s

の間違いです。
失礼しました。
    • good
    • 0

VS2010のプロジェクトの初期設定だと、UNICODEを使用するようになっていると思います。


その場合、LOGFONTのlfFaceNameは

wchar_t lfFaceName[LF_FACESIZE];

となるので、strcpy_sの引数と型があわないと判断されるのではないでしょうか。
テンプレートタイプを呼び出したいのであれば、_tcscopy_sまたはwcscopy_sを使う必要があるのではないでしょうか。
    • good
    • 0

引数2つにこだわるなら、strcpyだと思いますが。

    • good
    • 0
この回答へのお礼

迅速なお返事ありがとうございます.
strcpyでも試してみましたが違うエラーが出てしまいました.
どうやら私のミスでdefineしていなかったことが問題でした.
ご迷惑をお掛けして申し訳ありませんでした.

お礼日時:2010/06/23 02:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報