0

好吧,这个让我发疯。我不知道为什么不调用构造函数。

这是代码:

template<class T>
struct JV {
  JV() {}
  JV(const T& t0) : F{{t0}} {
    std::cout << __PRETTY_FUNCTION__ << "\n";
  }
  std::array<T,1> F;
};


template<class T>
struct RS : public JV<T>
{
  RS(): JV<T>() {}

  RS(const T& rhs) : JV<T>(rhs) {
    std::cout << __PRETTY_FUNCTION__ << "\n";
  }
};



template<class T>
struct PS : public JV<T>
{
  PS(): JV<T>() {}

  PS(const T& rhs) : JV<T>(rhs) {
    std::cout << __PRETTY_FUNCTION__ << "\n";
  }
};


template<class T>
struct WJ
{
  WJ() {
    std::cout << "WJ::WJ()\n";
  }
};


int main() {
  PS<RS<WJ<float> > > wj;
  std::cout << "go for it\n";
  PS<PS<RS<WJ<float> > > > copy(wj);
}

如果使用 GCC g++ 4.7.2 编译-std=c++0x并运行,输出为:

WJ::WJ()
go for it
JV<T>::JV(const T&) [with T = PS<RS<WJ<float> > >]
PS<T>::PS(const T1&) [with T1 = PS<RS<WJ<float> > >; T = PS<RS<WJ<float> > >]

为什么不JV<T>::JV(const T&) [with T = PS<RS<WJ<float> > >]调用重载的构造函数PS<RS<WJ<float> > >::PS<RS<WJ<float> > >(const RS<WJ<float> >&)

编辑:

此外,在限制重载的构造函数时它不会调用它,见上文。

4

1 回答 1

3

模板构造函数永远不是复制构造函数。编译器使用复制构造函数在inPS<RS<WJ<float>>>内部构造。您没有在您的代码副本构造器中进行跟踪,因此之后没有显示其他消息。std::arrayJVJV<T>::JV(T const&)

于 2012-10-15T16:33:56.423 回答