Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将指针数组传递给模板类方法_C++_Arrays_Templates_Pointers - Fatal编程技术网

C++ 将指针数组传递给模板类方法

C++ 将指针数组传递给模板类方法,c++,arrays,templates,pointers,C++,Arrays,Templates,Pointers,简单地说,我有一个模板类树,它有一个createTree(Data*arrayData[])方法。此方法接收指向data类型数据的指针数组: template<class Data> void Tree<Data>::createTree(Data* arrayData[]) { m_indexCreation = 0; cout << sizeof(arrayData) / sizeof(int) << endl; m_r

简单地说,我有一个模板类树,它有一个
createTree(Data*arrayData[])
方法。此方法接收指向data类型数据的指针数组:

template<class Data>
void Tree<Data>::createTree(Data* arrayData[]) {
    m_indexCreation = 0;
    cout << sizeof(arrayData) / sizeof(int) << endl;
    m_root = createChildTree(arrayData);
}
我可以毫无问题地在
main()
中打印整个数组的值,但是在
createTree()
中,数组的大小以某种方式减小为1,单个值为NULL

我做错了什么?

检查C常见问题解答

答:编译器假装数组参数声明为指针(即,在本例中,声明为char*A;请参见问题6.4),sizeof报告指针的大小。另见问题1.24和7.28

解决办法。将大小作为参数传递

void Tree<Data>::createTree(Data* arrayData[], int sz)
{
    ...
}

Tree<string> tree;
tree.createTree(tab, sizeof(tab)/sizeof(tab[0]));
void Tree::createTree(Data*arrayData[],int sz)
{
...
}
树木;
createTree(tab,sizeof(tab)/sizeof(tab[0]);

选项卡
被发送到函数时,它将进行数组到指针的转换:

从C++标准中,4.2 [标准转换] < /P> 类型为“N T数组”或“T的未知边界数组”的左值或右值可以转换为prvalue 类型为“指向T的指针”。结果是指向数组第一个元素的指针

因此,您的初始签名将类似于以下内容:

Tree<Data>::createTree(Data** arrayData);
或者您可以使用
std::vector
,因为更容易获得大小:

#include <vector>

void Tree<Data>::createTree(std::vector<Data*> arrayData)
{
    std::cout << arrayData.size();
}

int main()
{
    std::vector<std::string> tab;

    for (int i = 0; i < 20; ++i) // shortened for this example
    {
        tab[i] = new std::string("James Johnson");
    }

    ...
}
#包括
void Tree::createTree(std::vector arrayData)
{

std::cout
sizeof(tabDonnees)/sizeof(int)
可能产生1。您将指针的大小除以int的大小。此外,方法creerArbre(createTree)无法确定
选项卡
的大小,它只通过地址传入,不存储其大小,编译器也不传递其大小。@Alexis Leclerc,你好,Alexis,欢迎使用SO。请考虑到SO的大多数用户都是全球开发人员。发布法语、西班牙语、印度语或德语的代码是个坏主意sch,或阿拉伯语或其他任何东西。我翻译了它。@StephaneRolland-这有关系吗?他的问题本身是英语的。只有类名和函数名使用不同的语言。这没关系。@user93353好吧,对我来说没关系,我是法国人,他的代码是法语;-)但我记得当我看到印地语、印尼语、变量名和函数名时ions…这真的没有帮助我理解代码中发生了什么…我们在一个国际互助网站上。如果你问Meta,我想我读过一个Q/a,上面说英语是这个网站的语言。这就是我记得的。也许代码中有相反的答案是可以接受的,但我不记得了。谢谢你的通知,我下次会翻译我的代码;)谢谢你的翻译!
template <class Data, unsigned N>
createTree(Data* (&arrayData)[N]); // you can print out N for the size
//                                    but sizeof(x)/sizeof(*x) will still work
#include <vector>

void Tree<Data>::createTree(std::vector<Data*> arrayData)
{
    std::cout << arrayData.size();
}

int main()
{
    std::vector<std::string> tab;

    for (int i = 0; i < 20; ++i) // shortened for this example
    {
        tab[i] = new std::string("James Johnson");
    }

    ...
}