【问题标题】:Templates in C++ / referenceC++ 中的模板/参考
【发布时间】:2017-06-03 14:54:02
【问题描述】:

现在是凌晨 3:30,我正在做一个关于 C++ 模板的练习。 在这种情况下,我不明白我做错了什么,你能帮我理解吗? (我不太擅长 C++,从 2 周前开始)。

这里是主题:

[...],您必须对函数进行编码 模板 foreach 。此功能允许通过以下方式浏览数组 为此数组的每个元素调用一个函数。功能 接受数组开头的地址作为参数,a 函数的引用和数组的大小。上的参考 函数对应如下原型: void func(const type& 元素);此外,您必须提供传递给的函数 print 函数 foreach 并显示每个元素,每行一个, 无论他们是什么类型。

这是我的代码:

ex03.hpp

#ifndef __EX03_H_INCLUDED__
# define __EX03_H_INCLUDED__

#include <iostream>
#include <iomanip>

template<typename type>
void foreach(type tab[0], (*)(print(const type& elem)), type size)
{
  int                   i;

  for (i = 0; i != size; i++)
    print(tab[i]);
}

template<typename type>
void print(const type& elem)
{
  std::cout << elem << std::endl;
}

#endif /* !__EX03_H__ */

和:

main.cpp

#include "ex03.hpp"

int main(void)  
{
  int tab[] = { 11, 3, 89, 42 };
  foreach(tab, print<int>, 4);
  std::string tab2[] = { "j’", "aime", "les", "templates", "!" };
  foreach(tab2, print, 5);
  return 0;
}

我只允许上交 ex03.hpp,这只是一个测试主文件。 我想了解我做错了什么。谢谢!

【问题讨论】:

  • 请正确格式化您的代码。
  • 这是一个基本的语法错误。你把foreach 的第二个参数的声明弄错了。使用c++decl 或一本书来找出正确的语法。
  • 如果您“2 周前开始”使用 C++,您应该在大约六个月内掌握模板的主题。首先,在深入了解毛茸茸的部分之前,您需要很好地掌握基本知识。
  • 另外,你的包含守卫是非法的。
  • 加快速度的第一步是忘记函数指针和内置数组。这些东西有奇怪的语义和更好的替代品,只会让你退缩(就像这里一样)。一般来说,我建议阅读一本好的 C++ 书籍,它不需要三周的时间,而且比大多数课程更有用。

标签: c++ function templates pointers reference


【解决方案1】:

问题出在 foreach 模板函数中:

  • 第一个参数可以是指向数组的指针,也可以是大小未定义的静态数组数组
  • 第二个参数可以是函数指针或函数的引用(它应该通过引用接受与数组元素相同类型的常量元素,因为它不会被修改)
  • 第三个参数应该是不同的类型,因为数组大小不一定与数组元素类型相同

固定的 ex03.hpp 看起来像这样:

#ifndef __EX03_H_INCLUDED__
#define __EX03_H_INCLUDED__

#include <iostream>

// option 1
template<typename T1, typename T2>
void foreach(T1* arr, void (*fnc)(const T1&), T2 size) {
    for (T2 i = 0; i < size; i++) {
        (*fnc)(arr[i]);
    }
}

// option 2
template<typename T1, typename T2>
void foreach(T1 arr[], void (&fnc)(const T1&), T2 size) {
    for (T2 i = 0; i < size; i++) {
        (*fnc)(arr[i]);
    }
}

template<typename T1>
void print(const T1& element) {
    std::cout << element << std::endl;
}

#endif /* !__EX03_H__ */

还有main.cpp:

#include "ex03.hpp"

#include <string>

int main() {
    const size_t tab1Size = 4;
    int tab1[tab1Size] = { 11, 3, 89, 42 };

    foreach(tab1, print, tab1Size);

    const size_t tab2Size = 5;
    std::string tab2[tab2Size] = { "j’", "aime", "les", "templates", "!" };
    foreach(tab2, print, tab2Size);

    return 0;
}

但我同意之前其他人所说的,你应该先学习 c++ 的基础知识,这样才能更容易理解更复杂的东西。

【讨论】:

  • 第一个参数(我假设你的意思是你说“参数”的“参数”)写得很好,尽管不寻常。第二个参数也可以是参考,这可能是练习所要求的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多