0

私が書いたクラスと関数のテンプレートを含むプロジェクトに取り組んでいます。コンパイル時にこのエラーが発生します:

SNN.h In function `void KNN(const std::vector<T, std::allocator<_CharT> >&, std::vector<Cluster<T, K>, std::allocator<Cluster<T, K> > >&) [with T = int, unsigned int K = 5u]':

このエラーが続きます(私はそれらが接続されていると思います):

1)instantiated from `void ClusteringExample() [with T = int]'
2)instantiated from here:ClusteringExample<int>();
3)SNN.h [Warning] comparing floating point with == or != is unsafe
**4) conversion from `<unknown type>' to non-scalar type `__gnu_cxx::__normal_iterator<const Product*, std::vector<Product, std::allocator<Product> > >' requested**  

ClusteringExampkeがfuncテンプレートの場合。これが実装です:

template <typename T>
void ClusteringExample()
    {
        std::vector<T> T_input;
        std::vector<Cluster<T,cluster_size> > clusters_T;
        FillVector( T_input, count_per_line );
        SNN( T_input, clusters_T);
        for (typename std::vector<Cluster<T,cluster_size> >::size_type i=0;       
    i<clusters_T.size(); i++ )
        {
            clusters_T[i].Print();
            std::cout << std::endl;
        }
        std::cout  << "===="<< std::endl; 
    }

KNNのコード:**

void  KNN( const std::vector<T>& all_items, std::vector<Cluster<T,K> >& result )
{
     result.clear(); 
     if ( K > all_items.size() ) return; //we cannot create clusters bigger than the number of all items
     //for each item in all_items we will create a cluster
     for (typename std::vector<T>::size_type i=0; i < all_items.size(); i++ )
     {
         //this vector will save distances to the item i
         std::vector<double> distances;
         //passing over all items and calculating distance to the item i
         for (typename std::vector<T>::size_type j=0; j < all_items.size(); j++ )
         {
             distances.push_back( Distance(all_items[i], all_items[j] ));
         }
          //creating new cluster
         Cluster<T,K> new_cluster;
         //we are looking for K nearest distances
         std::sort( distances.begin(), distances.end() );
         for ( std::vector<double>::size_type d=0; d<K; d++ )
         {
              for (typename std::vector<T>::size_type j=0; j < all_items.size(); j++ )
               {
                  if (Distance(all_items[i], all_items[j] ) == distances[d] ) //every item which is closer then the "farest" is added to the cluster
                  {
                     new_cluster.Add( all_items[j] ); //we don't use the return value of Add in this implementation, but you need to support it
                  }
               }
         }
         result.push_back( new_cluster );

**言わなければならないこと:それは私がインスタンス化しようとしているすべてのタイプ(int、double、およびクラスタイプ)で発生しています。このエラーは私にはあまり有益ではありません。問題がどこにあるのか、誰か手がかりがありますか?

4

2 に答える 2

2

本当にこのコードがある場合:

template<typename T, size_t K> void Cluster<T,K>::Print() const {
  for(typename vector<T>::const_iterator iter=_cluster_vec.begin;iter!=_cluster_vec.end();++iter) {
    cout<<(*iter)<<" "; 
  }
}

begin次に、(a)に変更する必要がありbegin()、(b)元の質問にエラーのあるコードを投稿した場合は、より早く回答が得られます。

于 2012-06-23T16:34:04.200 に答える
0

この式Distance(all_items[i], all_items[j] ) == distances[d]は、場合によっては驚くべき効果をもたらすことがあります... 浮動小数点数 (floatまたはdouble) が等しいかどうかを決して比較しないでください。

詳細については、IEEE 754 規格を読み、Google で二重等価比較を検索することをお勧めします。

さらに、比較とコメントは直接行っていないようです。同等性を比較していますが、コメントは次のように主張しています。

//every item which is closer then the "farest" is added to the cluster

多分あなたは意味しました<=か?

于 2012-06-23T15:28:02.127 に答える