虚拟继承,显式实例化 - 返回派生类引用/指针(协变类型)

时间:2016-08-13 18:03:55

标签: c++ covariance virtual-inheritance explicit-instantiation covariant-return-types

.HPP

this

的.cpp

template <typename T>
struct A { virtual A& modify() = 0; };

template <typename T>
struct B : virtual A<T> {};

template <typename T>
struct C : B<T> { C& modify() final; };

我需要一些方法来返回引用,以便使“链”/定义赋值运算符/ etc。:

template <typename T>
C<T>& C<T>::modify() {
    // …
    return *this;
}

// explicit instantiation
template struct C<double>;

我还必须处理虚拟继承以避免“钻石问题”(为简单起见,这里省略)。

然而,这不起作用:

MSVC

C<double> a, b, c;
// …    
a = (b = c).modify();

显式实例化在没有虚拟继承的情况下工作正常。所以我想知道这里有什么问题。 (如果没有成员函数返回对象引用/指针,一切正常。)

1 个答案:

答案 0 :(得分:1)

显式实例化的正确语法应为:

template struct C<double>;
         ^^^^^

另外,您仍需要为C模板指定type参数:

C<double> a, b, c;
  ^^^^^^

至少g ++和clang接受此代码:http://coliru.stacked-crooked.com/a/23ba6a238a7a17da

但Visual Studio没有......

看起来VS不喜欢协变返回类型,下面在g ++ / clang和VS下编译但是 - 在modified()中没有协变返回:http://coliru.stacked-crooked.com/a/70c8e64f0824129a