从函数模板错误返回修改后的值

时间:2010-09-26 15:52:01

标签: c++ templates

我的代码是这样的:

   // ... code

   template <int i>
   int modifyparameter()
   {
     i = i++;
     return i;
   }

   // ... some more code

   int main()
   {
        int answer = modifyparameter<5>();
        cout << answer; //expecting 6
   }

但我收到错误。我做错了什么?

4 个答案:

答案 0 :(得分:4)

i是int 的名称,您无法修改值。你可能想要其中一个:

template <typename Number>
Number functional(Number x)
{
    return x + 1;
}

template <typename Number>
Number& side_effect(Number& x)
{
    return ++x;
}

答案 1 :(得分:3)

i不是lvalue,因此i++是非法的。

14.1/5说。

  

非类型非参考模板参数不是左值。它     不得转让或以任何其他方式改变其价值。

增量后运算符(++)需要lvalue作为操作数。

答案 2 :(得分:3)

尝试:

template <int i>
int modifyparameter()
{
  int copy_of_i = i;
  copy_of_i++;
  return copy_of_i;
}

您无法修改i本身,模板参数是编译时常量。但是,您可以通过使用具有静态生存期的变量来使其行为就像我被修改一样:

template <int i>
int modifyparameter()
{
  static int copy_of_i = i;
  copy_of_i++;
  return copy_of_i;
}

答案 3 :(得分:1)

虽然没有被要求,但这似乎是为编译时解决方案而哭泣:

template< int I >
struct increment { static const int result = I+1; };

std::cout << increment<41>::result << '\n';

那个struct就是所谓的元函数。是的,它是一个结构体,但是它(在编译时)就像一个函数一样使用:你调用它,传递一个参数,然后你得到一个结果。语法很搞笑,但那是因为没有人真正计划这样做;偶然发现了(或多或少)这种可能性。

在编译时执行此操作的优点是结果是编译时常量,可以这样使用:

int my_array[increment<7>::result]; // array of 7+1 ints

当然,定义这样的数组是无稽之谈。就像在运行时算法中一样,递增通常只是计算更复杂事物的算法的一个操作。