【问题标题】:c++ class dependant typedef declared outside classc++类依赖typedef在类外声明
【发布时间】:2014-05-04 13:22:17
【问题描述】:

我有两个类,我将它们称为classA 和classB。

在 A 类中,我定义了一些类型,例如 T5。
在 classB 中,我使用 classA 中定义的此类类型。

为了避免写

typename classA<T1,T2>::T5

在我的代码中,我想创建一个类独立类型, 我可以直接通过它的名字直接调用它 - templatedClassA 在示例中。模板参数仍然是参数化的,我会 在未来的项目中使用 classA 和 classB 定义它们。

#include <cstdlib>
#include <iostream>

using namespace std;

//classA
template <class T1, class T2>
class classA
{
 public:  
 typedef T1 T5;
 classA();
};

template <class T1, class T2>
classA<T1,T2>::classA(){}
//end classA

template <class T1, class T2>
typedef classA<T1,T2> templatedClassA;

template <class T1, class T2>
typedef typename classA<T1,T2>::T5 T6;






//classB
template <class T3, class T4>
class classB
{
 public:
 classB();
};

template <class T3, class T4>
classB<T3,T4>::classB(){}
//end classB



int main(int argc, char *argv[])
{

    classB<int, double> classBInstance;

    system("PAUSE");
    return EXIT_SUCCESS;
}

编译上述代码时,出现以下两个错误:

template declaration of `typedef class classA<T1, T2> templatedClassA'
template declaration of `typedef typename classA<T1, T2>::T5 T6'.

我做错了什么?

【问题讨论】:

    标签: c++ templates typedef c++98


    【解决方案1】:

    模板不能在typedef 声明中使用。您必须将声明包装在这样的类中:

    template <class T1, class T2>
    class templatedClassA {
        typedef classA<T1, T2> type;
    };
    
    template <class T1, class T2>
    class T6 {
       typedef typename classA<T1, T2>::T5 type;
    };
    

    在 C++11 中,您可以使用 using 别名,如其他答案所示。

    【讨论】:

    • 好的,谢谢您的回答。我在 templatedClassA::type 和 T6::type 看到的问题是它与 classA 和 class::T5; 相同。它不像我想要的那样简化符号,我认为它变得更重了......
    • @geraldCelente:T5 是否只依赖于第一个模板参数?
    • 嗯,不,在真正的代码中。它依赖于一堆其他类和内部类型。
    • 嗯...但是从您上面写的内容来看,您似乎是在说 templatedClassA::type 不依赖于 T2。如果是这种情况,您可以从 templatedClassA 中删除第二个模板参数。
    • @geraldCelente 我想你可以像template&lt;typename T1, typename T2&gt; struct T5 : classA&lt;T1, T2&gt; { };一样使用继承
    【解决方案2】:

    在 C++11 中,你可以这样做:

    template <class T1, class T2>
    using templatedClassA = classA<T1, T2>;
    
    template <class T1, class T2>
    using T6 = typename classA<T1, T2>::T5;
    

    【讨论】:

    • 好的,谢谢您的回答。抱歉,我忘了说我正在研究 c++'98。
    猜你喜欢
    • 2013-05-10
    • 2016-12-17
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多