从模板化的类定义非模板化的类

时间:2012-07-11 07:29:48

标签: c++

假设我有一个名为模型的模板类。现在让我们在这个类中声明一个名为texture的类,它不需要模板参数。我如何定义它,以便无论给予Model类的模板参数,纹理对象都是相同的。这就是它的样子。

template<class T>
class Model
{
    class Texture;
};

class Model::Texture //error because model requires a template argument.
{


};

那么我能在这做什么吗?

3 个答案:

答案 0 :(得分:5)

你应该这样写:

template<typename T>
class Model<T>::Texture 
{
  //you should be able to use T here, even though Texture is not a template!

   T m_data;   //T here
   Texture(T data); //T here also, as the constructor parameter!

};

由于Model是一个类模板,因此此处T仅适用于ModelTexture仍然是非模板。

Online demo

答案 1 :(得分:2)

namespace detail {
class Texture
{

};
}

template<class T>
class Model
{
    typedef detail::Texture Texture;
};

detail命名空间会阻止您的API用户直接访问该类。如果您不导出任何API,则不必担心这一点。 typedef允许通过使用模板化名称限定的名称访问非模板化类。

答案 2 :(得分:2)

您还可以使用常见的非模板化祖先:

class ModelBase
{
    class Texture;
};


template<class T>
class Model : public ModelBase
{

};

class ModelBase::Texture
{

};