【问题标题】:Template function declared as void - code doesn't work?声明为 void 的模板函数 - 代码不起作用?
【发布时间】:2018-02-09 12:04:22
【问题描述】:
#include <iostream>
#include <string>

template<int T, int U>
void foo(T a, U b)
{
    std::cout << a+b << std::endl;
}

int main() {
    foo(2,4);
    return 0;
}

我收到以下错误:

错误:变量或字段 'foo' 声明为 void

错误:在 'a' 之前应为 ')'

错误:在 'b' 之前应为 ')'

在函数'int main()'中: 错误:“foo”未在此范围内声明

【问题讨论】:

  • 模板不是这样工作的。您的模板参数是类,或typenames,而不是ints。
  • @SamVarshavchik 如果我想指定两个参数都是ints 怎么办?显然,我可以只创建一个标准函数,但是可以使用模板来完成吗?
  • 由于T 不是类型,foo 不能是函数。因此,它必须是一个变量,而void 不是变量的有效类型。 (注意template&lt;int T&gt; int variable(T); 是 C++14 中的有效声明。)
  • @grizloni97 如果要指定两个参数都是int,则不应使用模板函数。
  • 如果你希望两个参数都是int,你只需声明一个带有两个 int 参数的普通函数。就是这样。这就是普通函数的用途。这不是模板的用途。

标签: c++ templates


【解决方案1】:

您模板中的TU 不是类型。您需要将其更改为:

template<typename T, typename U>
void foo(T a, U b) {
}

【讨论】:

    【解决方案2】:

    模板参数可以是整数,例如:

    template<int A, int B>
    void bar()
    {
        std::cout << A+B << std::endl;
    }
    

    但是,您似乎想根据参数的类型参数化您的方法,而不是整数。正确的模板应该是这样的:

    template<typename T, typename U>
    void foo(T a, U b)
    {
        std::cout << a+b << std::endl;
    }
    
    int main() {
        bar<2,4>();
        foo(2,4);     // note: template parameters can be deduced from the arguments
        return 0;
    }
    

    【讨论】:

    • 谢谢!我知道模板的目的是通用性,但我实际上想知道传递两个 ints 的语法是什么,这是您答案的第一部分。
    • @grizloni97 非类型参数并不罕见,但它们也不是最常见的。您可以查看std::array 以获得非类型参数的一个很好的示例(第二个参数是数组的大小)
    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 2018-10-09
    • 2011-08-27
    • 1970-01-01
    • 2013-09-18
    • 2015-01-16
    相关资源
    最近更新 更多