我有一些在VC9(Microsoft Visual C++ 2008)中编译好的模板代码,但不能在GCC 4.2(在Mac上)编译。我想知道是否有一些我错过的语法魔法。调用模板化内部类静态成员函数的C++语法?
下面我有一个精简的例子,它演示了我的错误。对不起,如果这个例子似乎毫无意义,我尽可能地去除这个错误。
特别是我有一个模板类S,它有一个内部类R也是一个模板类。从顶级模板函数foo,我试图调用[R ::追加其为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中的错误。 – 2010-01-19 07:57:13
显然这是Visual C++的一个非标准“特性”。 C++规范指出在这种情况下需要消歧。 VC让你跳过它。我不知道是否有一个编译器开关让VC更严格地执行规范合规性? – jwfearn 2010-01-21 01:45:22