模板编程初学者问题

时间:2018-06-20 19:00:14

标签: c++ templates

我有一些基本的模板编程错误。

我在main.cpp中有此代码:

#include <string>
#include <iostream>
#include "arrapp.h"
#include <algorithm>
#include <vector>

const int max = 1000;

int main()
{
  int your_mark = 1;
  /* 2-es*/
  int s[] = {3, 2};
  array_appender<int> ia ( s, sizeof( s ) / sizeof( s[ 0 ] ) );
  for( int i = 0; i < max - 1; ++i )
  {
    ia.append( s, sizeof( s ) / sizeof( s[ 0 ] ) );
  }

  std::string hw[] = { "Hello", "World" };
  std::string langs[] = { "C++", "Ada", "Brainfuck" };
  std::string x[] = { "Goodbye", "Cruel", "World" };
  array_appender<std::string> sa ( hw, sizeof( hw ) / sizeof( hw[ 0 ] ) );
  sa.append( langs, sizeof( langs ) / sizeof( langs[ 0 ] ) );
  sa.append( x, sizeof( x ) / sizeof( x[ 0 ] ) );

  const array_appender<std::string> ha( hw, sizeof( hw ) / sizeof( hw[ 0 ] ) );


  if ( max * 2 == ia.size() && 3 == ia.at( max ) && 2 == ia.at( 3 ) &&
       &( s[ 0 ] ) == &(ia.at( max / 2 ) ) && 2 == ha.size() && 8 == sa.size() &&
       "C++" == sa.at( 2 ) && 7 == sa.at( 5 ).length() && &( ha.at( 0 ) ) == hw )
  {
    your_mark = ia.at( max + 1 );
  }
  std::cout << "Your mark is " << your_mark;
  std::endl( std::cout );
}

我必须通过编写"arrapp.h"来解决这个问题。所以我创建了这个:

#ifndef arrapp_H
#include <algorithm>
#include <list>
#include <vector>
#include <array>

template <typename T>
T const& array_appender (std::vector <T const&> v, T const& size) {
   std::vector<T*> vec [size]= {};
    for( int idx = 0; idx < size; ++idx)
    {
        std::cout << "value of v: " << v[idx] << std::endl;
        vec.add(v[idx]);
    }
   return vec;
}
#endif // arrapp_H

但是,如果我使用此命令,则会收到错误main.cpp|14|error: expected ';' before 'ia'|。所以这是行不通的。我该如何创建这些模板内容才能正常工作?我被误解了吗,array_appender这里没有我写的那样?

2 个答案:

答案 0 :(得分:1)

先尝试一些简单的方法。您似乎错过了一些基本概念,因此我将尝试为您提供一个基本示例。

模板功能:

template <typename T> 
T add(const T& a,const T& b) { return a+b; }

模板类:

template <typename T>
struct adder {
    T result;
    adder(const T& a, const T& b) : result(a+b) {}
};

可以这样使用:

int a = 4;
int b = 5;
std::cout << add(a,b);

auto x = adder<int>(a,b);
std::cout << x.result;

我不得不提到,我对所有这些答案都不感到骄傲。您应该意识到,您不会在这里提出问题来学习基础知识,也无法完全解释进入这两个简单示例的所有内容,因此我可以写两章(老实说,我不能那样做;)。可悲的事实是,您将不得不阅读一些书籍。

答案 1 :(得分:0)

如果我理解正确,那么您需要编写array_appender,使其与您已经拥有的main.cpp一起使用。

您已经定义了模板函数,但需要一个模板类,如下所示:

template<typename T>
class array_appender {
public:
    array_appender(T* array, size_t size) {
        append(array, size);
    }
    void append(T* array, size_t size) {
        // ...
    }
    T at(size_t index) {
        // ...
    }
    size_t size() {
        // ...  
    }
private:
    std::vector<T> data;
}