【问题标题】:template declaration of `typedef typename Foo<T>::Bar Bar'`typedef typename Foo<T>::Bar Bar' 的模板声明
【发布时间】:2013-10-04 23:10:36
【问题描述】:

我在声明模板类型时遇到了很大的困难,如下所示。

#include <cstdlib>
#include <iostream>

using namespace std;


template <class T>
class Foo
{
 typedef T Bar;
};

template <class T>
typedef typename Foo<T>::Bar Bar;




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

    Bar bar;

    Foo<int> foo;


    system("PAUSE");
    return EXIT_SUCCESS;
}

我得到错误

template declaration of `typedef typename Foo<T>::Bar Bar' 

关于线路

template <class T>
typedef typename Foo<T>::Bar Bar;

我这样做是因为我想避免在我的代码中写入 typename Foo::Bar。

我做错了什么?

【问题讨论】:

    标签: c++ templates typedef typename


    【解决方案1】:

    C++ 中的typedef 声明不能是模板。但是,C++11 添加了一种替代语法,使用 using 声明来允许参数化类型别名:

    template <typename T>
    using Bar = typename Foo<T>::Bar;
    

    现在你可以使用了:

    Bar<int> x;   // is a Foo<int>::Bar
    

    【讨论】:

    • 谢谢!你们所有人都同样乐于助人。我希望我能接受收到的所有三个答案。无论如何,我会投票赞成所有三个答案。
    • @geraldCelente:我认为这并不重要,否则任何人都会不高兴——选择你认为最有用的答案:-)(或者扔硬币。)
    • 是否有一个库(例如:boost)为仍在脱离 C++11 潮流的编译器(如 gcc/mingw 编译器)提供“后退”?
    【解决方案2】:

    typedef 不能是模板。这正是 C++11 发明别名模板的原因。试试

    template <class T>
    using Bar = typename Foo<T>::Bar;
    

    【讨论】:

    • 谢谢!你们所有人都同样乐于助人。我希望我能接受收到的所有三个答案。无论如何,我会投票赞成所有三个答案。
    【解决方案3】:

    您不能typedef 模板。但是,您可以使用别名模板。下面的代码演示了使用并修复了一些其他问题:

    template <class T>
    class Foo
    {
    public:
        typedef T Bar;
    };
    
    template <class T>
    using Bar =  typename Foo<T>::Bar;
    
    int main(int argc, char *argv[])
    {
        Bar<int> bar;
        Foo<int> foo;
    }
    

    【讨论】:

    • 谢谢!你们所有人都同样乐于助人。我希望我能接受收到的所有三个答案。无论如何,我会投票赞成所有三个答案。
    【解决方案4】:

    希望可以添加迟到的答案...

    我仍在使用似乎没有实现别名模板的 VS2012,因此我出于我的目的使用了这种混合物:

    //map<CWinThread*, AKTHREADINFO<T> > mapThreads;   // won't compile
    #define MAP_THREADS(T) map<CWinThread*, AKTHREADINFO<T> >
    
    ...
    
    MAP_THREADS(T) mapThreads;
    

    抱歉,它没有演示原始示例,但您理解了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      • 2022-11-04
      • 2012-01-25
      • 1970-01-01
      • 2017-07-25
      相关资源
      最近更新 更多