0

.hpp

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; };

.cpp

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

// explicit instantiation
template struct C<double>;

我需要一些方法来返回引用以制作“链”/定义赋值运算符/等:

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

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

但是,这不起作用:

MSVC

Error C2908: explicit specialization; 
'A<T> &C<T>::modify(void)' has already been instantiated

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

4

1 回答 1

1

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

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

此外,您仍然需要为 C 模板指定类型参数:

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

于 2016-08-13T18:23:29.093 回答