[C++ エラー処理] transform の呼び出しに一致する関数がありません。
このエラーはとても愚かなことだと思うのですが、どうでしょうか。状況は以下の通りです。
#include
#include
#include
using namespace std;
int main (int argc, char * const argv[]){
string str = "Hello";
transform(str.begin(), str.end(), str.begin(), toupper);
cout << str << endl;
return 0;
}
プログラムの意味は簡単で、Hello allを大文字に変換してこいということです。
コンパイルが通らない。
$ g++ -g -Wall strToUpper.cpp -o strToUpper
strToUpper.cpp: In function 'int main(int, char* const*)':
strToUpper.cpp:9: error: no matching function for call to 'transform(__gnu_cxx::__normal_iterator, std::allocator > >, __gnu _cxx::__normal_iterator, std::allocator > >, __gnu_cxx::__normal_iterator, std::allocator > >, )'</CHAR*,> & lt;/CHAR*,></CHAR*,>
その後、原因は以下のように特定されました。
この関数の定義を見てみよう。
template OutIter transform(InIter start, InIter end, OutIter result, Func unaryFunc)
Linuxでは、toupperを関数ではなく、マクロとして実装しています。
/usr/lib/syslinux/com32/include/ctype.h:
/* 注:unsignedへの偶発的な昇格を避けるため、これは16進数ではなく10進数です */
#define _toupper(__c) ((__c) & ~32)
#define _tolower(__c) ((__c) | 32)
__ctype_inline int toupper(int __c)
{
return islower(__c) ? _toupper(__c) : __c;
}
__ctype_inline int tolower(int __c)
{
return isupper(__c) ? _tolower(__c) : __c;
}
解決策は3つあります。
1. グローバル名前空間に実装された関数(マクロではない)があるため、名前空間を明示する。これは必ずしもうまくいかないが、私のg++環境では問題ない。
transform(str.begin(), str.end(), str.begin(), ::toupper) とします。
2. 自作ラッパーから関数を書き出す
inline charToUpper(char c)
{
return std::toupper(c);
}
3. 強制変換:toupper を、戻り値が int で引数が int のみの関数ポインタに変換します。
transform(str.begin(), str.end(), str.begin(), (int (*)(int))toupper);
著者
グヌフック
プロヴァンス
http://www.cnblogs.com/gnuhpc/
関連
-
'node' は内部または外部のコマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
-
RuntimeWarning: double_scalars で無効な値が検出されましたが、正常に解決されました。
-
許容メモリサイズは134217728バイトで、問題は解決された php
-
JDKをインストールすると、エラーが発生します。エラー: java.dll が見つかりません。
-
[エラー] '}' トークンの前に期待される式
-
Uncaught TypeError: Node' の 'removeChild' の実行に失敗しました: 1 つの引数が必要ですが、0 つしかありません。
-
Gulpのマルチタスクエラーです。AssertionError [ERR_ASSERTION]: タスク関数を指定する必要があります ソリューション
-
Python Basics-TypeError: 位置引数を2つ取るが、3つ与えられている
-
json文字列のダブルクォートが&quotになるのですが、どうすれば解決できますか?
-
Android Studio FAQ -- AndroidManifest.xml のカバレッジに関する問題
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
clang: error: linker command failed with exit code 1 (use -v to see invocati
-
場所 0x00000004 の読み取りでアクセス違反が発生しました。
-
com.android.tools.build:gradle:3.3.1 が見つかりませんでした。
-
ダブルフリーまたはコラプション(Fasttop)生成
-
解決策:gpg: Can't check signature: public key not found エラーが発生しました。
-
Android StudioでInvalid Gradle JDK configuration foundというエラーが表示される。
-
IOSの致命的なエラー: Optional値のアンラップ中に予期せずnilが検出された
-
エクセル関数VLOOKUPの使い方一覧、十分です!
-
Swagger の @ApiModel アノテーション
-
パラメータの例外です。引数型[java.lang.Integer]の名前がありません。