为什么一个代码编译而另一个代码失败?

时间:2014-04-24 15:05:46

标签: c++

此代码符合:

template <class T>
class A {};

void main () {

    A<int> a;
    vector<A<int>> vec;
    vec.push_back(a);
}

但这并不是:

void main () {

    SharedPointer<int> sp;
    vector<SharedPointer<int>> vec;
    vec.push_back(sp);
}

我收到此错误:

  

错误C2558:class&#39; SharedPointer&#39; :没有可用的复制构造函数   或复制构造函数已声明&#39;显式&#39;

SharedPointer标题:(所有方法都在标题中实现)

#include <iostream>
#include "Myexception.h"
using namespace std;

#pragma once

template<class T>
class SharedPointer {
    T* ob;
    int* refcount;
    bool shareable;

    int refdown();
    int refup();
    void markUnshareable();
public:

    virtual ~SharedPointer();
    SharedPointer():shareable(true);
    SharedPointer(T pointee):shareable(true);
    SharedPointer(SharedPointer<T>& sp);
    SharedPointer operator=(const SharedPointer<T>& sp);
    bool operator==(const SharedPointer<T>& sp);
    const T& operator[](const int idx) const;
    T& operator[](const int idx);
    T* operator->() const;
    T& operator*() const;
    void setOb(T pointee);
    const T& getOb() const;
    int getRefcount();
    bool isShareable();
    bool isShared();
};

2 个答案:

答案 0 :(得分:3)

问题是复制构造函数:

SharedPointer(SharedPointer<T>& sp);

不能仅用于复制const指针。添加缺少的const,一切都应该没问题:

SharedPointer(const SharedPointer& sp);   // <T> is harmless, but unnecessary

(您还必须修复构造函数定义中的语法错误,并且应该将main的返回类型更改为int。删除using namespace std;也是一个好主意。)

答案 1 :(得分:1)

您的复制构造函数已声明

SharedPointer(SharedPointer<T>& sp);

应该是这样的:

SharedPointer(const SharedPointer<T>& sp);

因此编译器将找到缺少的复制构造函数