gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:35:24 26 4
gpt4 key购买 nike

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

#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 中编译上述代码时出现以下错误:-

错误:-

Severity Code Description Project File Line Suppression State Error C2558 class 'Grid': no copy constructor available or copy constructor is declared 'explicit'

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

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

}

错误:

Severity Code Description Project File Line Suppression State Error LNK2019 unresolved external symbol "public: __thiscall Grid::Grid(unsigned int,unsigned int)" (??0?$Grid@N@@QAE@II@Z) referenced in function _main

Error LNK1120 2 unresolved externals

Error LNK2019 unresolved external symbol "public: virtual __thiscall Grid::~Grid(void)" (??1?$Grid@N@@UAE@XZ) referenced in function "public: virtual void * __thiscall Grid::`scalar deleting destructor'(unsigned int)" (??_G?$Grid@N@@UAEPAXI@Z)

最佳答案

模板构造函数永远(!)不是复制构造函数。您代码中的构造函数只是一个转换构造函数。

你可能两者都想要:

#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;
}

另见:

关于c++模板复制构造函数不可用或显式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37680229/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com