从类模板派生时,“类”不会命名类型

时间:2014-05-27 13:16:45

标签: c++ templates

我正在努力使用C ++模板。这是我的代码的简化版本。实际上,我将它分为.cpp和.h文件,但我只是简短地说明了问题。

#include <iostream>

template<typename T>
class GenericColor
{
};

template<typename T>
class RGB : public GenericColor<T>
{
public:
    HSV toHSV();
};

class HSV : public GenericColor<double>
{
};

编译结果是:

prog.cpp:12:2: error: ‘HSV’ does not name a type
  HSV toHSV();
  ^

https://ideone.com/HnvC6F

3 个答案:

答案 0 :(得分:4)

编译器从上到下读取。您需要转发声明HSV。

放:

class HSV;

之前class RGB

答案 1 :(得分:1)

当编译器读取RGB的定义时,HSV尚未定义 声明。你需要先申报。以下代码是正确的:

template<typename T>
class GenericColor
{
};


class HSV : public GenericColor<double>
{
};

template<typename T>
class RGB : public GenericColor<T>
{
public:
    HSV toHSV();
};

有些情况下,在合适的情况下定义类并不容易 订购。在这种情况下,您可以声明您需要的那个,并定义它 后来。这被称为前向声明。请参阅以下代码:

#include <iostream>

template<typename T>
class GenericColor
{
};

class HSV; // the forward-declaration

template<typename T>
class RGB : public GenericColor<T>
{
public:
    HSV toHSV();
};

// the definition of HSV
class HSV : public GenericColor<double>
{
};

答案 2 :(得分:0)

您需要先定义HSV,然后才能从成员函数返回它。在这种情况下,只需将HSV类def粘贴到RGB类def。

之上