2017-02-08 19 views
-1

私はLipmannを学んでおり、私は勉強しています。私はここでベクトルの最小要素を返すコードを書くことを試みています。 Codeblocksでコードをコンパイルすると、「テンプレートの宣言はブロックスコープには表示されません」と表示されます。ここでは、コードです:あなたが関数内のテンプレートを定義することはできませんテンプレートの宣言はブロックスコープには表示されません

#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; 
} 
+1

実際には、単に 'std :: min_element'を使うことができます。 –

+0

ここでのポイントは、OPがそのような関数テンプレートを実装する方法を理解しようとしていたことです。 – SU3

答えて

2

、およびmain機能です。あなたはminファンクションテンプレートをメインの外に定義する必要があります。

コードには他にもいくつか問題があります。

template <class elemType> 

は、関数定義の直前に指定する必要があります。

elemType save; 

これらの間に正しい構文がありません。

もう1つの問題は、ベクトルの最小値を選択するアルゴリズムです。なぜあなたはこの

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()がよく定義されています。

+0

ありがとうございました – FishTheBig

+0

完了:はい、まさに私が欲しかったことです。あなたの答えは素晴らしいです、あなたの注意のために感謝してください:) – FishTheBig

+0

このコードは*多くの*コンパイルエラーがあり、空のベクトルの場合は考慮しません。 'min'は要素ではなくイテレータを返すか、ベクトルが空でないことを宣言します。もちろん、実際のコードでは、単に 'std :: min_element'を使うだけです。 –

関連する問題