2017-07-06 4 views
0

テンプレートを使って宣言された構造体があるクラスがあります。ヘッダファイルにクラス構造を記述する方法を見つけ出すことはできませんヘッダのクラステンプレート

私は次のコード .hファイル

を書くしようとしているヘッダファイルには.cppファイル

#include <map> 
#include <numeric> 

class Statistics { 
    private: 
     std::map<int, int> *data; 

     struct add_first { 
      template<class Pair> 
      int operator()(int value, const Pair& pair) const { 
       return value + pair.first; 
      } 
     }; 

     struct add_second { 
      template<class Pair> 
      int operator()(int value, const Pair& pair) const { 
       return value + pair.second; 
      } 
     }; 

     struct add_expectation { 
      template<class Pair> 
      int operator()(int value, const Pair& pair) const { 
       return value + (pair.first * pair.second); 
      } 
     }; 

    public: 
     Statistics(std::map<int, int> *load_data) { 
      data = load_data; 
     } 

     double get_mean() { 
      return std::accumulate((*data).begin(), (*data).end(), 0.0, add_first())/(*data).size(); 
     } 

     double get_expectation() { 
      return std::accumulate((*data).begin(), (*data).end(), 0.0, add_expectation())/std::accumulate((*data).begin(), (*data).end(), 0.0, add_second()); 
     } 
}; 

#ifndef STATISTICS_H 
#define STATISTICS_H 

#include <map> 

class Statistics { 
    private: 
     std::map<int, int> *data; 
     struct add_first { 
      template<class Pair>; 
      int operator()(int value, const Pair& pair) const; 
     }; 
     struct add_second { 
      template<class Pair>; 
      int operator()(int value, const Pair& pair) const; 
     }; 
     struct add_expectation{ 
      template<class Pair>; 
      int operator()(int value, const Pair& pair) const; 
     }; 
    public: 
     Statistics(std::map<int, int> *load_data); 
     double get_mean(); 
     double get_expectation(); 
}; 

#endif 

しかし、この定義では、コンパイラは識別子Pairが定義されていないというエラーを生成します。どうしましたか?

+0

問題は余分なセミコロンにあります。しかし、https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file?rq=1 – Angew

+0

も参照してください。また、クラスを両方とも定義しないでください。ヘッダーとその実装ファイル。 – Angew

+0

はい、余分なセミコロンに気付いてありがとうございます。ただし、コンパイル後のエラーは残りました。 – Victor

答えて

1

@Angewですべての疑念を払ってもエラーはありません。

  1. 余分なコロンを削除します。
  2. ヘッダーファイルでのみクラスを定義します。
関連する問題