编译器错误:模板类分配不匹配

时间:2014-11-10 01:15:46

标签: c++ templates

我正在尝试使用隐含指针创建一个解决方法,以隐藏库的大部分内部,同时仍保留基本功能。目前我依赖模板,下面的代码产生以下编译器错误,我不知道如何解决:

prog.cpp: In function ‘int main()’:
prog.cpp:55:10: error: no match for ‘operator=’ (operand types are ‘std::auto_ptr<TypeAdapter_impl<mytype> >’ and ‘TypeAdapter_impl<mytype>*’)  t._impl = tam;

以下是代码:

#include <iostream>
#include <memory>
using namespace std;

typedef long document_ptr;

class mytype {
    public:
    mytype(document_ptr d) {
        a = d;
        std::cout << "Instantiated mytype with document_ptr " << a << "\n";
    }
    document_ptr a;
};

class TypeContainer {
public:
    void * _t; 
    TypeContainer(void * t) {  _t = t; }
    ~TypeContainer() { delete _t; }
    // TODO operator *
};

class DocumentContainer {
    public:
    document_ptr * doc;
};

template<class Type>
class TypeAdapter_impl
{
    public:
    TypeAdapter_impl() { }
    ~TypeAdapter_impl() { }

    TypeContainer TypeFactory(DocumentContainer& d){
        Type * t = new Type(d.doc);
        return TypeContainer(t);
    }
};

template<class Type>
class TypeAdapter
{
    public:
    std::auto_ptr< TypeAdapter_impl<Type> > _impl;
};



int main() {
    // your code goes here
    TypeAdapter<mytype> t;
    TypeAdapter_impl<mytype> * tam = new TypeAdapter_impl<mytype>;
    t._impl = tam;
    DocumentContainer d;
    d.doc = new document_ptr(10);
    mytype m = t._impl->TypeFactory(d);
    return 0;
}

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您在问题中提到的错误是由以下原因引起的:

  1. operator=中没有std::auto_ptr,其中RHS的类型为T*
  2. 构造函数std::auto_ptr::auto_ptr(T*)是显式的(See reference)。
  3. 这不起作用。

    std::auto_ptr<int> a;
    int* b = new int;
    a = b;
    

    这很有效。

    std::auto_ptr<int> a;
    int* b = new int;
    a = std::auto_ptr<int>(b);
    

    根据您的情况,更改行

    t._impl = tam;
    

    t._impl = std::auto_ptr<TypeAdapter_impl<mytype>>(tam);
    

    删除编译器错误。

    您的代码中还有其他问题。

    ~TypeContainer() { delete _t; }
    
    由于_t的类型为void*

    无效。

    mytype m = t._impl->TypeFactory(d);
    
    由于TypeAdapter_impl::TypeFactory()的返回类型为TypeContainer且无法将TypeContainer转换为mytype

    无效。

    该行

        Type * t = new Type(d.doc); // FIXME document_ptr not defined here!
    

    也不对。 doc中定义的main指向10个元素的数组。不知道你有兴趣在这里使用哪一个。将其更改为:

        Type * t = new Type(d.doc[0]);
    

    删除编译器错误。