模板声明仅适用于在它们之前立即声明的函数吗

时间:2019-03-05 15:06:28

标签: c++ templates

我正在编写一个示例程序,以帮助您理解C ++中的模板。我正在尝试使用模板类来具有多个功能。

下面是我编写的以下代码。

// Example program
#include <iostream>
#include <string>
using namespace std;

template<class test>
test addstuff(test a, test b){
    return a+b;
}
test multiplystuff(test a,test b){
    return a*b;
}

int main()
{
  double a,b,c;
  cout << "Enter a value for a." << endl;
  cin >> a;
  cout << "Enter a value for a." << endl;
  cin >> b;
  c = addstuff(a,b);
  cout << c << endl;
  c = multiplystuff(a,b);
  cout << c << endl;

}

我得到的错误是在函数的测试multiplystuff中,它不在我收到的错误范围内。我希望模板能够处理多个功能,这可能是什么问题?

3 个答案:

答案 0 :(得分:4)

此:

// ...

test multiplystuff(test a,test b){
    return a*b;
}

// ...

这看起来像功能模板吗?对于编译器,事实并非如此。即使对于人类,如果我看到它也不是功能模板。

现在让我们再次添加上下文:

template<class test> // has template parameters
test addstuff(test a, test b) {
    return a + b;
}

// no template parameters
test multiplystuff(test a,test b) { // cannot access test?
    return a * b;
}

一个功能是模板,但第二个功能显然不是。

期望test在第二个函数中可用,就像期望参数可以被其他函数访问一样:

// has int parameter
void func1(int a) { /* ... */ }

// no int parameter
void func2() {
    // cannot access a
}

在此示例中,afunc2的范围之外。

功能模板也会发生同样的事情。模板参数在函数外部不可用。

显然,解决方案是将缺少的参数添加到第二个函数中。

答案 1 :(得分:2)

您实际上根本没有模板类。您有2个不相关的自由函数addstuffmultiplystuff,而template<class test>仅适用于第一个。 实际使用一个类或添加另一个template<class test>,如下所示:

template<class test>
test addstuff(test a, test b)
{
    return a + b;
}

template<class test> 
test multiplystuff(test a,test b)
{
    return a * b;
}

也不要using namespace std;

答案 2 :(得分:0)

template<class test> 不是模板声明。它也没有声明一个类(或类模板)。它构成模板声明的 part (在这种情况下。它也可以构成定义的一部分)。

相反

template<class test>
test addstuff(test a, test b){
    return a+b;
}

模板声明,template<class test> test addstuff(test a, test b);也是这样。

如果您想同时将addstuffmultiplystuff都用作模板,则必须将它们都声明为模板。但是,我只会使用+*