关于 c:Visual Studio 2015 rc 中从模板类派生的类的构造函数继承

Constructor inheritance for class derived from template class in visual studio 2015 rc

根据msvs2015rc的页面,应该支持新特性构造器继承。是的,它适用于这样的简单情况:

1
2
3
4
5
6
struct B {
    B(int) {}
};
struct D : B {
    using B::B; // now we can create D object with B's constructor
};

但如果我尝试创建更复杂的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <class T>
struct B
{
    B(int) {}
};

template <template <class> class C, class T>
struct D : C< T >
{
    using C< T >::C;
};

int main() {

    D<B,int> d(42);
    return 0;
}

我遇到了编译器错误:

  • error C2039: 'C': is not a member of 'B<T>'
  • error C2873: 'C': symbol cannot be used in a using-declaration
  • error C2664: 'D<B,int>::D(D<B,int> &&)': cannot convert argument 1 from 'int' to 'const D<B,int> &'

当且仅当将模板模板类 C 重命名为 B:

时,我才能消除这些错误

1
2
3
4
5
template <template <class> class B, class T>
struct D : B< T >
{
    using B< T >::B;
};

我认为这是一个编译器错误,因为所有这些代码都使用 gcc/clang 编译得很好。

有人对这个问题有其他看法吗?


这是 MSVC 中的一个错误,它也出现在他们在线提供的最新版本中。所以,请提交错误报告。相关讨论可以在其他 SO question 中找到。它包含一些标准的摘录,解释了为什么它应该起作用。