编译错误:无法在c ++中将object_type <t>转换为object_type <t> </t> </t>

时间:2013-08-05 00:04:21

标签: c++ templates compiler-errors

我在写作的共享指针类中有一个方法。

template<class T>
template<class Y>
shared_ptr<T> &shared_ptr<T>::operator=(/*const*/ shared_ptr<Y> &r)
{
  shared_ptr<T>(r).swap(*this);
  return *this;
}

以这种方式使用时

class Foo
{
};

class Bar : public Foo
{
};

int main(int /*argc*/, char * /*argv*/[]) {
  shared_ptr<Foo> giPtr(new Foo(1));
  shared_ptr<Bar> giPtr2;
  giPtr2 = glext::dynamic_pointer_cast<Foo>(giPtr);
} 

在MSVC中生成以下错误:

1>c:\users\mehoggan\documents\github\x86-applications\glextensions\smart_ptrs\shared_ptr\shared_ptr.inl(53): error C2440: '<function-style-cast>' : cannot convert from 'glext::shared_ptr<T>' to 'glext::shared_ptr<T>'
1>          with
1>          [
1>              T=Foo
1>          ]
1>          and
1>          [
1>              T=Bar
1>          ]
1>          No constructor could take the source type, or constructor overload resolution was ambiguous
1>          main.cpp(28) : see reference to function template instantiation 'glext::shared_ptr<T> &glext::shared_ptr<T>::operator =<Foo>(glext::shared_ptr<Foo> &)' being compiled
1>          with
1>          [
1>              T=Bar
1>          ]

构造

template<class T>
  shared_ptr<T>::shared_ptr() : 
    _px(0), 
    _pn()
  {}

  template<class T>
  template<class Y>
  shared_ptr<T>::shared_ptr(Y * p) : 
    _px(p), 
    _pn()
  {
    internal::shared_pointer_construct(this, p, _pn);
  }

  // TODO: Create shared ptr from weak pointer

  template<class T>
  shared_ptr<T>::shared_ptr(const shared_ptr &r) :
    _px(r._px),
    _pn(r._pn)
  {}

  template<class T>
  template<class Y>
  shared_ptr<T>::shared_ptr(const shared_ptr<Y> &r, element_type *p) :
    _px(p), 
    _pn(r._pn)
  {}

  template<class T>
  shared_ptr<T> &shared_ptr<T>::operator=(const shared_ptr<T> &r)
  {
    shared_ptr<T>(r).swap(*this);
    return *this;
  }

交换

template<class T>
void shared_ptr<T>::swap(shared_ptr<T> &other)
{
  std::swap(_px, other._px);
  _pn.swap(other._pn);
}

1 个答案:

答案 0 :(得分:3)

这个问题经常出现在MSVC上。

您可以尝试使用'inject'名称,而不是返回类型的模板ID:

template<class T>
template<class Y>
shared_ptr<T> &shared_ptr<T>::operator=(/*const*/ shared_ptr<Y> &r)
{
  shared_ptr(r).swap(*this); // note: no <T> there
  return *this;
}

我不太确定,但你可能很幸运定义了这个课堂内

template<class T> class shared_ptr
{
    template<class Y>
    shared_ptr& operator=(shared_ptr<Y> &r)
    {
      shared_ptr(r).swap(*this); // note: no <T> there
      return *this;
    }
    // ...

我在这里猜测一下,但我认为在定义方法体时,类可能“显得”不完整。我不认为这应该是一个问题,但MSVC两阶段查找 1 是众所周知的......困扰。


1 (基本上是模板实例化机制)