当前位置: 首页 > 知识库问答 >
问题:

c 模板复制构造函数不可用或显式

郁高韵
2023-03-14

我用模板复制构造函数写了一段代码,以便更好地理解这个概念,因为我是新手,但是下面的代码无法编译

#include <iostream>
#include <vector>

using namespace std;

template <typename T>
class Grid
{
public:
    explicit Grid(size_t inWidth = kDefaultWidth, size_t inHeight = kDefaultHeight);
    virtual ~Grid();

    template <typename E>
    Grid(const Grid<T>& src);

    static const size_t kDefaultWidth = 10;
    static const size_t kDefaultHeight = 10;
    std::vector<std::vector<T>> mCells;
    size_t mWidth, mHeight;
};

template <typename T>
template <typename E>
Grid<T>::Grid(const Grid<T>& src)
{
    cout << "Copy constructor working " << endl;

}

int main()
{
    Grid<double> myDoubleGrid;
    Grid<double> newDoubleGrid(myDoubleGrid);
    return 0;
}

在Visual Studio中html" target="_blank">编译上述代码时出现以下错误:-

错误:-

严重性代码描述项目文件行抑制状态错误C2558类“网格”:没有可用的复制构造函数或复制构造函数被声明为“显式”

我试图用E替换参数的模板,但它显示了更多的错误(奇怪的错误)

template <typename T>
template <typename E>
Grid<T>::Grid(const Grid<E>& src)
{
    cout << "Copy constructor working " << endl;

}

错误:

严重性代码描述项目文件行抑制状态错误LNK2019未解析外部符号“public:__thiscall Grid::Grid(unsigned int,unsignedint)”(?0$Grid@N@@QAE@II@Z) 在函数_main中引用

错误LNK1120 2未解析的外部

错误LNK2019无法解析的外部符号“public:virtual _ _ this call Grid::~ Grid(void)”(??1?$Grid@N@@UAE@XZ)在函数“public:virtual void * _ _ this call Grid::` scalar deleting destructor '(unsigned int)”中引用(??_G?$Grid@N@@UAEPAXI@Z)

共有3个答案

闾丘冠玉
2023-03-14

因为你愚蠢的错误,你称之为危险错误的事情正在发生:-

1)您已经为构造函数和析构函数提供了声明。正如你所说,这是你唯一的源文件。这意味着您必须没有定义它们,这就是您得到的链接器错误的原因。有时这些非常简单的问题会被证明是非常危险和耗时的。

如果您不想提供任何详细的实现,可以用一对大括号替换分号。

2)您正在尝试做的事情是完全无逻辑的,因为您正在使用类似于复制构造函数的符号创建一个转换器构造函数。无论如何,编译器会优先选择复制构造函数,而不是转换器构造函数。

最终,您对构造函数的定义将永远不会被真正调用。

冯良才
2023-03-14

请注意<code>网格

万俟宜修
2023-03-14

模板构造函数从来都不是(!)复制构造函数。代码中的构造函数只是一个转换构造函数。

您可能同时需要:

#include <iostream>
#include <vector>

// Please do not have this ugliness in a header!
using namespace std;

template <typename T>
class Grid
{
public:
    explicit Grid(size_t inWidth = kDefaultWidth, size_t inHeight = kDefaultHeight)
    // initialize members ...
    {}

    // Without this copy-constructor the compiler generates a copy-constructor
    // (with no output, of course)
    Grid(const Grid& src) 
    // initialize members ...
    {
        cout << "Copy constructor" << endl;
    }

    template <typename E>
    Grid(const Grid<E>& src) 
    // initialize members ...
    {
        cout << "Converting constructor" << endl;
    }

    static const size_t kDefaultWidth = 10;
    static const size_t kDefaultHeight = 10;
    size_t mWidth, mHeight;
};

int main()
{
    Grid<double> myDoubleGrid;
    Grid<double> newDoubleGrid(myDoubleGrid); // Copy constructor
    Grid<int> newIntGrid(myDoubleGrid);       // Converting constructor
    return 0;
}

另见:

  • http://en.cppreference.com/w/cpp/language/copy_constructor
  • http://en.cppreference.com/w/cpp/language/converting_constructor
  • 从模板基类的模板构造函数派生
 类似资料:
  • 主要内容:默认拷贝构造函数拷贝和复制是一个意思,对应的英文单词都是 。 对于计算机来说,拷贝是指用一份原有的、已经存在的数据创建出一份新的数据,最终的结果是多了一份相同的数据。例如,将 Word 文档拷贝到U盘去复印店打印,将 D 盘的图片拷贝到桌面以方便浏览,将重要的文件上传到百度网盘以防止丢失等,都是「创建一份新数据」的意思。 在 C++ 中,拷贝并没有脱离它本来的含义,只是将这个含义进行了“特化”,是指用已经存在的对

  • 我有一个类,它的操作类似于智能指针。以下是重要的比特: 现在,我希望能够从构造,而不是相反。复制赋值运算符也是这样:应该合法,但不应该合法。 现在,我想添加一个模板,专门化或其他东西,但我肯定有一个更好的方法来做这件事。请注意,非常量版本必须将常量版本添加为友元,才能访问constructor/assignmnent运算符中的私有成员。

  • 在G++中。如果复制构造函数不是显式的,代码可以编译并正常工作(但我希望强制执行只有对对象的引用才能用作参数和返回值)。代码还在删除对的调用后进行编译(因此不成问题)。因此,我的问题是,std::sort在调用使编译此代码失败的比较函数时会做什么,以及如何修复它。 经过大量的研究,唯一接近我的问题是复制初始化,对复制构造函数的调用是显式的还是隐式的?它链接到GCC中的一个bug。然而,clang显

  • 我对复制构造函数是新手,当我开始使用向量时,似乎无法让它们工作。 我在编译时遇到的错误是: 机器人cpp:复制构造函数中的Robot::Robot(const Robot 如何在复制构造函数中复制向量数组?

  • copy constructor是一个构造函数,它通过使用先前创建的同一类的对象初始化它来创建对象。 复制构造函数用于 - 从另一个相同类型的对象初始化。 复制对象以将其作为参数传递给函数。 复制对象以从函数返回它。 如果没有在类中定义复制构造函数,则编译器本身定义一个。如果该类具有指针变量并具有一些动态内存分配,则必须具有复制构造函数。 这里显示了最常见的复制构造函数形式 - classname

  • 主要内容:1、实例构造函数,2、静态构造函数,3、私有构造函数在 C# 中,构造函数就是与类(或结构体)具有相同名称的成员函数,它在类中的地位比较特殊,不需要我们主动调用,当创建一个类的对象时会自动调用类中的构造函数。在程序开发的过程中,我们通常使用类中的构造函数来初始化类中的成员属性。 C# 中的构造函数有三种: 实例构造函数; 静态构造函数; 私有构造函数。 1、实例构造函数 构造函数是类中特殊的成员函数,它的名称与它所在类的名称相同,并且没有返回值。当