【发布时间】:2010-01-19 07:32:04
【问题描述】:
我有一些模板代码在 VC9 (Microsoft Visual C++ 2008) 中编译得很好,但在 GCC 4.2 (在 Mac 上) 中不能编译。我想知道我是否缺少一些语法魔法。
下面我有一个简化的示例来演示我的错误。对不起,如果这个例子看起来毫无意义,我尽可能多地删除以隔离这个错误。
特别是我有一个模板类 S,它有一个内部类 R,它也是一个模板类。从顶级模板函数 foo,我试图调用 R::append,它是 R: 的静态成员函数:
template< typename C >
struct S {
template< typename T >
S<C> & append( const T & ) { return *this; }
template< int B >
struct R {
template< typename N >
static S<C> & append( S<C> & s, const N ) {
return s.append( 42 );
}
};
};
template< typename C >
S<C> & foo( S<C> & s, const int n ) {
S<C>::R<16>::append( s, n ); // error: '::append' has not been declared
return s;
}
有谁知道我做错了什么?
【问题讨论】:
-
+1,我想知道这是 Visual Studio 中的错误还是 gcc 中的错误。
-
显然这是 Visual C++ 的非标准“功能”。 C++ 规范说在这种情况下需要消除歧义。 VC让你跳过它。我想知道是否有针对 VC 的编译器开关以使其更严格地执行规范合规性?