我有以下代码:
#include <iostream>
struct Q{ int i; };
namespace detail
{
template<typename T, typename U> struct base
{
Q q;
base( Q const& qq ):q(qq){ printf("q"); }
};
}
template <typename T> struct vec : public detail::base<T, vec<T>>
{
using detail::base<T, vec<T>>::base; // All: OK
using Z = typename detail::base<T, vec<T>>;
using Z::base; // GCC: OK, MSVC: OK, Clang: ERR
using typename Z::base; // GCC: OK, MSVC: ERR, Clang: OK
};
int main()
{
Q q{2};
vec<float> v( q );
}
如果我继承了没有任何代理别名/ typedef的基类的CTOR,它会在所有3个主要编译器上编译,但它可以用完全模板化的基类来详细说明(这就是问题)。当使用Z时,GCC非常自由,但MSVC和Clang不同意,我倾向于给予MSVC信誉。对于typename,MSVC说Z :: base不是一个类型名,实际上不是。
哪一个是符合使用Z的代码?