G++ 不编译某些嵌套模板
g++ doesn't compile certain nested templates
当定义BREAK时,g++ 4.7.2将不会编译以下内容,我认为这是有效的c++。如果将A<U> tmp
更改为其他东西(如A<int> tmp
),则会使用定义的BREAK进行编译-虽然这使得这里的最小测试用例工作,但在我的实际应用程序中并不好。这里有什么不合法的c++吗?
template <typename T>
class B {
};
template <typename T>
class A {
public:
template <typename U> B<U> *alloc_B( );
};
template <typename T> template <typename U>
B<U> *A<T>::alloc_B( ) {
return new B<U>( );
}
#ifdef BREAK
template <typename T>
class C {
public:
template <typename U> void x(B<U> &b) {
A<U> tmp;
B<U> *tmp2;
tmp2 = tmp.alloc_B<U>( );
delete tmp2;
}
};
#endif
int main( ) {
A<int> a;
B<float> *bp = a.alloc_B<float>( );
delete bp;
#ifdef BREAK
C<int> c;
B<float> b;
c.x(b);
#endif
}
alloc_B
函数模板为依赖模板名。你必须这样称呼它:
tmp2 = tmp.template alloc_B<U>( );
这就是问题所在,这就是为什么当您使用A<int>
时它可以工作的原因,因为类型不再依赖于模板参数U
。
这是由于C++
的一个令人讨厌的解析规则。当它看到tmp.alloc_B<U>
时,不会将其解释为模板,而是解释为tmp.alloc_B < U
。要解决这个问题,您需要显式指定这是一个模板:
tmp2 = tmp.template alloc_B<U>( );
相关文章:
- 实现编译检查以避免C++嵌套范围
- C 嵌套结构上的 g++ 编译错误
- 为什么我在编译中经常出现错误:包含嵌套太深的 C++
- 带有可变参数的嵌套宏在GCC中编译,但在MSVC中不编译
- 通过指向成员的指针对嵌套访问进行编译时评估期间出现 GCC 错误
- 为模板类嵌套类定义 std::hash 时出现编译错误
- 为什么 Visual C++无法编译从私有嵌套类继承的友元模板
- 在 Unix 中编译 c++ 时嵌套模板参数出错
- gcc segfault在编译嵌套参数包代码上
- 嵌套的lambda表达式在用Visual C++编译和生成巨大的对象文件时速度非常慢
- 编译时对嵌套模板参数求和
- 嵌套类中的编译问题
- 从嵌套在模板中的类派生时编译问题
- 正在尝试使用模板编译嵌套类
- 嵌套的映射括号初始化无法编译
- c++11嵌套lambda编译segfault
- 使用嵌套lambda时出现奇怪的编译错误
- 带有嵌套名称空间的Bison和C++不会为我编译
- 为什么VC++2013拒绝编译嵌套类型,当用作模板函数返回类型时,用using关键字使其可见
- c++嵌套头文件包括编译