Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从模板化类定义非模板化类_C++ - Fatal编程技术网

C++ 从模板化类定义非模板化类

C++ 从模板化类定义非模板化类,c++,C++,假设我有一个名为model的模板类。现在让我们在这个类中声明一个名为texture的类,它不需要模板参数。我该如何定义它,以便无论给模型类的模板参数是什么,纹理对象都是相同的。这就是它看起来的样子 template<class T> class Model { class Texture; }; class Model::Texture //error because model requires a template argument. { }; 我能在这里做些什么

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

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

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


};

我能在这里做些什么吗?

你应该这样写:

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!

};
由于模型是一个类模板,所以这里T仅适用于模型。纹理仍然是非模板


你应该这样写:

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!

};
由于模型是一个类模板,所以这里T仅适用于模型。纹理仍然是非模板

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


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

您也可以为此使用一个通用的非模板化祖先:

class ModelBase
{
    class Texture;
};


template<class T>
class Model : public ModelBase
{

};

class ModelBase::Texture
{

};

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

class ModelBase
{
    class Texture;
};


template<class T>
class Model : public ModelBase
{

};

class ModelBase::Texture
{

};


如果纹理不是真正依赖于模型,则可以将其移动到类外。如果纹理不是真正依赖于模型,则可以将其移动到类外。据我所知,这仍然意味着Model::Texture与Model::Texture是不同的类。它们不会相互分配,编译器可能会复制它们的所有代码。哦,这实际上仍然适用于我的目的。我知道它们在技术上是不同的类,我只是不知道如何在内部定义非模板类而不出错。它现在确实很好用。当它让meHey,@Nawaz,在OP纹理中是模型的一个内部类时,将接受答案。你必须提到这是某种方式。@FatalCatharsis:how to do X without errors这个短语和how to do X是一样的,不是吗?另外一点要注意的是:在许多编译器方面,纹理是一个模板。这样做的一个结果是,您不能简单地将其实现捆绑到单独的翻译单元。您必须确保为所有必需的模板参数实例化它们,或者在头中提供实现,以便编译器能够处理实例化。据我所知,这仍然意味着Model::Texture与Model::Texture是不同的类。它们不会相互分配,编译器可能会复制它们的所有代码。哦,这实际上仍然适用于我的目的。我知道它们在技术上是不同的类,我只是不知道如何在内部定义非模板类而不出错。它现在确实很好用。当它让meHey,@Nawaz,在OP纹理中是模型的一个内部类时,将接受答案。你必须提到这是某种方式。@FatalCatharsis:how to do X without errors这个短语和how to do X是一样的,不是吗?另外一点要注意的是:在许多编译器方面,纹理是一个模板。这样做的一个结果是,您不能简单地将其实现捆绑到单独的翻译单元。您必须确保为所有必需的模板参数实例化它们,或者在头中提供实现,以便编译器能够处理实例化。嘿,问题实际上只是关于定义非模板类所涉及的语法,但实际上这是一个非常好的建议,因为我有一个指向这些模型对象的指针映射,这些对象的定义也依赖于模板,这是我不想要的。所以我会接受你的建议,让它们从一个基类派生出来+1 :P@FatalCatharsis,如果这是您实际使用的答案,那么最好接受这一点。我希望纳瓦兹不会生气,因为他的答案目前是公认的。很抱歉。@MvG:如果纹理想要使用T(它是一个模板参数)来建模类模板,该怎么办?请看我的例子。请看我对另一个答案中的同一条评论的回复。@MvG:这并不完全是对原始问题的回答,它更像是对更优雅代码的提示。不过,我还是很欣赏这个技巧,因为它也解决了我的另一个问题。有时候我希望我能接受多个解决方案-u-。嘿,问题实际上只是关于定义非模板类所涉及的语法,但实际上这是一个非常好的建议,因为我有一个指向这些模型对象的指针映射,这些模型对象的定义也依赖于模板,这是我不想要的。所以我会接受你的建议,让它们从一个基类派生出来+1 :P@FatalCatharsis,如果这是你实际使用的答案,它是m
你最好接受这一点。我希望纳瓦兹不会生气,因为他的答案目前是公认的。很抱歉。@MvG:如果纹理想要使用T(它是一个模板参数)来建模类模板,该怎么办?请看我的例子。请看我对另一个答案中的同一条评论的回复。@MvG:这并不完全是对原始问题的回答,它更像是对更优雅代码的提示。不过,我还是很欣赏这个技巧,因为它也解决了我的另一个问题。有时我希望我可以接受多个解决方案-u-。如果纹理想要利用T(它是一个模板参数)来建模类模板,该怎么办?请看我的例子。@Nawaz:如果纹理必须使用T,那么它必须以某种形式模板化。在这种情况下,您的解决方案是合适的。但正如我对OP的理解,特别是他的短语“纹理对象是相同的”,这对他来说并非如此。因此,这两种方法都是有效的,每种方法都适用于给定的用例。我们应该根据纹理是否需要T来选择合适的参数。如果纹理想要利用T(模板参数)来建模类模板,该怎么办?请看我的例子。@Nawaz:如果纹理必须使用T,那么它必须以某种形式模板化。在这种情况下,您的解决方案是合适的。但正如我对OP的理解,特别是他的短语“纹理对象是相同的”,这对他来说并非如此。因此,这两种方法都是有效的,每种方法都适用于给定的用例。我们应该根据纹理是否需要T选择合适的。