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
が定義されていないというエラーを生成します。どうしましたか?
問題は余分なセミコロンにあります。しかし、https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file?rq=1 – Angew
も参照してください。また、クラスを両方とも定義しないでください。ヘッダーとその実装ファイル。 – Angew
はい、余分なセミコロンに気付いてありがとうございます。ただし、コンパイル後のエラーは残りました。 – Victor