错误:聚合'food_type a'的类型不完整,无法定义

时间:2015-02-12 19:43:24

标签: c++ templates c++11

编译器不允许我运行此代码:

  

错误:聚合'food_type a'的类型不完整且无法定义

除非我在实例化()af1f2之后添加括号f3,这会阻止cout函数显示任何内容。为什么会这样?

#include <iostream>

enum class Animal { Cat, Dog, Duck};

class Food
{
public:
    Food()
    {
        std::cout<<"Food called"<<std::endl;
    }
};

template <enum Animal,class food_type>
class Ecosystem;

template<>
class Ecosystem<Animal::Cat,class food_type>
{
public:
    Ecosystem()
    {
        std::cout<<"Cat constructor called"<<std::endl;
        food_type a;
    }
};

template <>
class Ecosystem<Animal::Dog,class food_type>
{
public:
    Ecosystem()
    {
        std::cout<<"Dog constructor called"<<std::endl;
        food_type a;
    }
};


template <>
class Ecosystem<Animal::Duck,class food_type>
{
public:
    Ecosystem()
    {
        std::cout<<"Duck constructor called"<<std::endl;
        food_type a;
    }
};

int main()
{
    Ecosystem<Animal::Cat,Food> f1;
    Ecosystem<Animal::Dog,Food> f2;
    Ecosystem<Animal::Duck,Food> f3;
    return 0;
}

1 个答案:

答案 0 :(得分:5)

如果您尝试对模板进行部分专业化,则应按以下方式进行:

template<class food_type>
class Ecosystem<Animal::Cat,food_type>

而不是:

template<>
class Ecosystem<Animal::Cat,class food_type>

在第二种情况下,您实际所做的是基于不完整类型class food_type的完全专业化,这是造成错误的原因。