有点愚蠢为什么以下符合正常:
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编译器。
答案 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?