【问题标题】:Templated class and type return type for a member function成员函数的模板化类和类型返回类型
【发布时间】:2012-04-24 01:45:18
【问题描述】:

如果可能的话,我想在一个类中有一个返回模板类的函数,其中类和类模板值是模板参数。例如,

class AClass
{
public:
    template<typename ClassType, typename ClassTemplateType>
    ClassType<ClassTemplateType>* TestFunction() { return NULL; }
};

但是,如果我要做这样的事情,我会得到诸如

之类的错误

错误 C2988:无法识别的模板声明/定义

错误 C2059:语法错误:'

错误 C2143:语法错误:缺少 ';'在'}'之前

错误 C2238:';' 前面的意外标记

是否可以按照我提供的方式做某事,如果可以,怎么做?如果不是,为什么不呢?还有其他可以建议的吗?

【问题讨论】:

    标签: c++ templates generics design-patterns


    【解决方案1】:

    模板模板参数的语法是

    template<template<typename> class ClassType, typename ClassTemplateType>
    ClassType<ClassTemplateType>* TestFunction() { return NULL; }
    

    【讨论】:

    • 为什么是class ClassType 而不是template ClassType
    • @judeclarke 语法是template&lt;template&lt;typename [optional name]&gt; [class or typename] [template name]&gt;,在我们的例子中是template&lt;template&lt;typename&gt; ClassType&gt;
    • 不正确 -- 对于模板类型参数,classtypename 都可以使用,但对于模板模板参数,只允许使用 class
    • 在他的《现代 C++ 设计》一书中,Alexandrescu 使用这样的约定:模板参数如果只能是用户定义的类型,则使用 class 声明,如果它们也可以是用户定义的类型,则使用 typename原始类型。模板-模板参数 OTOH 必须是用户定义的类。
    • @rhalbersma 那是因为没有非用户定义的模板:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多