Объявления шаблонов работают только для функции, которую они объявили сразу - PullRequest
0 голосов
/ 05 марта 2019

Я пишу пример программы, чтобы помочь понять шаблоны на 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 ]

4 голосов
/ 05 марта 2019

This:

// ...

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
}

В этом примере a - этовыходит за рамки func2.

То же самое происходит с шаблоном вашей функции.Аргумент шаблона недоступен за пределами функции.

Очевидно, что решение заключается в добавлении отсутствующего аргумента во вторую функцию.

2 голосов
/ 05 марта 2019

У вас вообще нет шаблонного класса.У вас есть 2 несвязанные бесплатные функции addstuff и multiplystuff, и 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;

0 голосов
/ 05 марта 2019

template<class test> не объявление шаблона.Он также не объявляет класс (или шаблон класса).Он формирует часть объявления шаблона (в данном случае он также может являться частью определения).

Вместо

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

- объявление шаблона, как template<class test> test addstuff(test a, test b);.

Если вы хотите, чтобы addstuff и multiplystuff были шаблонами, вы должны объявить их оба шаблонами.Однако я бы просто использовал + и *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...