あなたは明らかにC++
について話しています(まだタグがないので、ここではC++だと思います)。さて、あなたが私のテンプレートの引数として
を言いたいように見える、私はモデル悲しいことに、文字列
が、現在はそれがまだできていないことを任意の型を受け入れます。これは、次のC++バージョンになるconcept
機能を必要とします。彼らについてのビデオはHereです。
何ができることは、あなたはそれが他のまたはカスタム文字列クラスを受け付けませんaswellとして狭い文字列
template <typename CharT, typename TraitsT>
std::basic_string<CharT, TraitsT> strUpper(basic_string<CharT, TraitsT> theString) {
typedef basic_string<CharT, TraitsT> StringT;
for(typename StringT::iterator it = theString.begin();
it != theString.end();
++it)
{
*it = std::toupper(*it, std::locale());
}
return theString;
}
ワイド文字列を受け入れるようにしたい場合は、たとえば、一般的なそれを維持したい場合はbasic_string<CharT, TraitsT>
を受け入れていますそれはの文字列でも起こります。あなたがいることをしたい場合、それは完全にそれを受け入れ、何の自由と何守れない
template <typename StringT>
StringT strUpper(StringT theString) {
for(typename StringT::iterator it = theString.begin();
it != theString.end();
++it)
{
*it = std::toupper(*it, std::locale());
}
return theString;
}
あなたは、彼らはそれが機能するために公開しなければならないものの機能や種類、そのライブラリのユーザーに通知する必要があります。コンパイラはその契約について知りません。代わりに、文字列ではない型で関数を呼び出すときにエラーメッセージがスローされます。多くの場合、エラーメッセージのページが見つかるでしょうし、何がうまくいかないのかという本当の理由になるのは難しいです。次のバージョンの標準で提案されているConcepts機能は、それをうまく修正します。あなたがやった場合
ない、あなただけ先に行くとあなたがを学ぶためにその機能を発明するつもりはないをしなかった場合は、この
std::string strUpper(std::string theString) {
for(std::string::iterator it = theString.begin();
it != theString.end();
++it)
{
*it = std::toupper(*it, std::locale());
}
return theString;
}
のように正常な機能を書き込むことができるよう汎用的な関数を記述しようとしますまず最初に、既に書かれた別のアルゴリズムを見つけられなかったので、ブーストstring algorithmライブラリを調べてください。あなたは書くことができます
boost::algorithm::to_upper(mystring);
なぜこれをテンプレートにしたいのですか? –
文字列はどのようにエンコードされていますか? – BigSandwich
Daniel Lは正しかったです(strUpper()をテンプレート以外の関数にする)上の行を削除するだけで、すべてがあなたの望むように動作します。 –