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