[解決済み] テンプレート宣言はブロックスコープに表示できない
2022-02-04 08:30:10
質問
リップマンを勉強しているのですが、勉強しかしていません。ここでは、ベクターの最小限の要素を返すコードを書こうとしています。Codeblocksでコンパイルすると、"A template declaration cannot appear at block scope"と表示されます。以下はそのコードです。
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
template <class elemType>
elemType save;
elemType min (const std::vector<elemType> &vec) {
std::vector<elemType>::iterator it = vec.begin(), end_it = vec.end();
std::vector<elemType>::iterator iter = std::next(it, 1);
for ( ; it != end_it; it++ ) {
if ( *it < *(it + 1) ) {
save = *it;
}
if (save < *it) {
save = *it;
}
}
};
int massiv[10] = {35, 66, 98, 15, 32, 41, 24, 90, 55, 100};
std::vector<int> vec_train(massiv,massiv+10);
min(vec_train);
return 0;
}
解決方法は?
関数内部でテンプレートを定義することはできませんし
main
は関数です。そのため
min
関数テンプレートはmainの外側で、mainの前にあります。
あなたのコードには、他にもいくつかの問題があります。その
template <class elemType>
は、関数定義の直前に記述する必要があります。置くこと
elemType save;
を挟むのは正しい構文ではありません。
もう一つの問題は、ベクトル中の最小値を選択するアルゴリズムです。なぜこのような
if (*save < *(it + 1) ) { save = *it; }
そして、この
if (*save < *it ) { save = *it; }
を同時に使用するのですか?
ここに、おそらくあなたが望むものがあるはずです。
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
template <class elemType>
const elemType& min(const std::vector<elemType>& vec) {
typename std::vector<elemType>::const_iterator
select = vec.begin(),
it = std::next(select),
end = vec.end();
for ( ; it != end; ++it ) {
if ( *it < *select ) select = it;
}
return *select;
};
int main() {
int massiv[10] = {35, 66, 98, 15, 32, 41, 24, 90, 55, 100};
std::vector<int> vec_train(massiv,massiv+10);
std::cout << min(vec_train) << std::endl;
return 0;
}
空のベクトルを処理する必要がある場合は、以下のように
if (!vec.size()) throw std::length_error("empty vector passed to min");
のように、関数の最初に置くか、要素参照ではなくイテレータを返します。
end()
は空のベクトルでもきちんと定義されています。
関連
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
-
[解決済み】ローカル変数のメモリはスコープ外からアクセスできる?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件