这里有一段非常有趣的代码。我创建它的唯一目的是演示 xlC 编译器的行为。
namespace ns {
template<typename T> inline T f() { return T(); }
template<> inline double f<double>() { return 0.001; } // test specialization
};
template<typename T >
class A1 {
public: A1( const T& arg = ns::f<T>() ) {};
};
template<typename T>
class D1 {
public: D1(T t = 0) : t_(t) {};
private: T t_;
};
class my {
A1< D1<int> > a;
public: my() ;
};
//namespace ns { template<> D1<int> f<D1<int> >() { return D1<int>(); } }
my::my() { };
void ff() {
my m;
A1<double> ad;
}
如果您按原样编译此代码,则会导致编译错误:
!$ xlC -c b.cpp
"b.cpp", line 7.40: 1540-0253 (S) This use of undefined class "D1<int>" is not valid.
"b.cpp", line 22.10: 1540-1205 (I) The error occurred while converting to parameter 1 of "A1<D1<int> >::A1(const D1<int> &)".
!$ xlC -qversion
IBM XL C/C++ for AIX, V12.1 (5765-J02, 5725-C72)
!$ uname -a
AIX build25 1 6 00C8B3424C00 powerpc AIX
现在,如果我们取消注释以“//命名空间”开头的行(这只是类型名 D1<int> 的模板特化,编译器错误就会消失。
Gnu编译器似乎没有问题。你们有什么想法吗?
PS。这个问题当然是在一个真实的项目中发现的,这只是一个简化的例子。在实际项目中,像 D1<int> 这样的类有数百个。他们认为开箱即用。但是对于 xlC,我必须为每个特定情况编写专门的函数。那很伤...