继承构造函数和模板别名

时间:2017-01-30 14:27:50

标签: c++

我有以下代码:

#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的代码?

0 个答案:

没有答案