具有多个模板参数的嵌套类声明

时间:2014-02-27 13:52:31

标签: c++ templates typename

有点愚蠢为什么以下符合正常:

template<typename T>
struct Foo {
    template<int i>
    struct Bar {
        typedef int BarSizeType;
    };
};

template<typename T, int i>
void do_something(typename Foo<T>::Bar<i>::BarSizeType arg) {
    // ...
}

但这不是:

template<typename T, typename T2>
struct Foo {
  template<int i>
  struct Bar {
    typedef int BarSizeType;
  };
};

template<typename T, int i>
void do_something(typename Foo<T, T>::Bar<i>::BarSizeType arg) {
  // ...
}

编译错误是:

  

错误C2143:语法错误:在'&lt;'之前缺少')'   错误C2143:语法错误:缺少';'在'&lt;'之前   错误C2988:无法识别的模板声明/定义
  错误C2059:语法错误:'&lt;'
  错误C2039:'BarSizeType':不是'`global namespace''的成员   错误C2059:语法错误:')'
  错误C2143:语法错误:缺少';'在'{'之前   错误C2447:'{':缺少函数头(旧式正式列表?)

我可以通过任何方式进行编译,而无需对代码进行大幅更改?我正在使用vs2012编译器。

1 个答案:

答案 0 :(得分:4)

这是MSVC中的一个错误;两者都不正确。你需要写template

void do_something(typename Foo<T>::template Bar<i>::BarSizeType arg) {
                                   ^ here

void do_something(typename Foo<T, T>::template Bar<i>::BarSizeType arg) {
                                      ^ and here

有关详细信息,请参阅Where and why do I have to put the "template" and "typename" keywords?