我有一个A级
template<typename T>
class A : public std::auto_ptr<T>
{
typedef std::auto_ptr<T> Super;
public:
A() : Super() { }
A(T* t) : Super(t) { }
A(A<T>& o) : Super(o) { }
...
};
和IConstEnumerator
template<typename T>
struct IConstEnumerator
{
...
virtual IEnumerator<T>* GetEnumerator() = 0;
virtual IConstEnumerator<T>* GetEnumerator() const = 0;
};
当我运行此代码时
AP< IConstEnumerator<IPort> > pe = node.GetPorts().GetEnumerator(); ;
我没有找到与g ++编译器正确匹配的错误。
error: no matching function for call to ‘AIR::A<AIR::IConstEnumerator<AIR::IPort> >::AP(AIR::A<AIR::IConstEnumerator<AIR::IPort> >)’
note: candidates are: AIR::A<T>::A(AIR::A<T>&) [with T = AIR::IConstEnumerator<AIR::IPort>]
note: AIR::A<T>::A(T*) [with T = AIR::IConstEnumerator<AIR::IPort>]
A班有什么问题?它适用于MSVC。
显式使用复制构造函数似乎解决了这个问题。 A< IConstEnumerator<IPort> > pe(node.GetPorts().GetEnumerator())
答案 0 :(得分:3)
您的A
拷贝构造函数通过非const引用获取其参数:
A(A<T>& o) : Super(o) { }
^ not const
您的示例可能会尝试复制临时对象,而非const引用无法绑定到临时对象。 Visual C ++有一个邪恶的扩展,允许它工作;如果您希望代码可以移植,则必须小心避免依赖该扩展名。
如果你试图模仿auto_ptr
的复制构造函数,你还需要实现类似于auto_ptr_ref
的东西,它被用作辅助函数以允许复制临时auto_ptr
。我在接受How could one implement std::auto_ptr
's copy constructor?
对于它的价值,源于std::auto_ptr
有点奇怪;考虑使用组合而不是继承,如果可以的话(std::auto_ptr
中没有一大部分你可以通过从中得到它而从中受益)。
答案 1 :(得分:2)
如果没有真正导致错误的确切代码,很难确切知道,但我怀疑从AIR::A<T>::A(AIR::A<T>&)
发生了什么事情你正试图将一个临时(可能是隐含的)对象传递给{{1}和MSVC允许您将临时绑定到非const引用参数,而g ++非常正确地禁止这一点。你可以制作参数AIR::A<T>::A
吗?
答案 2 :(得分:0)
我猜你缺少A(A<T> const & o)
。
VS(错误地)允许获得对临时的非const引用,g ++正常运行
答案 3 :(得分:0)
看起来编译器会说它无法选择正确的函数:来自指针A
的构造函数A<T>::A(T*)
或复制构造函数A<T>::A(A<T> &)
。也许值得将定义更改为explicit A(T* t) : Super(t) { }