g ++没有“调用错误的匹配函数”

时间:2011-03-09 19:19:29

标签: c++ g++

我有一个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())

4 个答案:

答案 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) { }