模板方法的专业化 - 我的代码出了什么问题?

时间:2010-05-20 06:56:26

标签: c++

这段代码出了什么问题?

class School {
public:
    template<typename T> size_t count() const;
private:
    vector<Boy*> boys;
    vector<Girl*> girls;
};
template<> size_t School::count<Boy>() const {
    return boys.size();
}

我的编译说

error: specialization of ‘size_t School::count() [with T = Boy]’
after instantiation

你能帮忙吗?

PS。这就是我以后要用它的方法:

School s;
size_t c = s.count<Boy>();

3 个答案:

答案 0 :(得分:6)

你错过了一个分号。

class School {
public:
    template<typename T> size_t count() const;
private:
    vector<Boy*> boys;
    vector<Girl*> girls;
};                           // <-- Missing semi-colon
template<> size_t School::count<Boy>() const {
    return boys.size();
}

答案 1 :(得分:4)

在声明之前,您是否在count<Boy> 中意外致电了School?重现错误的一种方法是

class Boy;
class Girl;

class School {
public:
    template<typename T> size_t count() const;
    size_t count_boys() const { return count<Boy>(); }
    // ^--- instantiation
private:
    std::vector<Boy*> boys;
    std::vector<Girl*> girls;
};

template<> size_t School::count<Boy>() const { return boys.size(); }
// ^--- specialization

int main () { School g; return 0; }

在所有模板成员都专业化之后,您需要移动count_boys()的定义。

答案 2 :(得分:0)

这个可编译的代码使用g ++编译并运行正常:

#include <vector>
using namespace std;

struct Boy {};
struct Girl {};

class School {
public:
    template<typename T> size_t count() const;
private:
    vector<Boy*> boys;
    vector<Girl*> girls;
};

template<> size_t School::count<Boy>() const {
    return boys.size();
}

int main() {
    School s;
    size_t c = s.count<Boy>();
}

将来,请更加努力发布可编辑的代码 - 换句话说,代码包含必要的头文件和支持类。