1

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

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

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


};

那么我可以在这里做些什么吗?

4

3 回答 3

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仍然是非模板。

在线演示

于 2012-07-11T07:31:09.610 回答
2
namespace detail {
class Texture
{

};
}

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

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

于 2012-07-11T07:32:23.923 回答
2

您还可以为此使用通用的非模板祖先:

class ModelBase
{
    class Texture;
};


template<class T>
class Model : public ModelBase
{

};

class ModelBase::Texture
{

};
于 2012-07-11T07:41:05.680 回答