2015-12-03 10 views
-1

Написание этой программы для класса, который должен иметь возможность создавать 4 объекта класса и использовать функции шаблона для вызова арифметических операций для разных типов данных. Мои ошибки говорят мне, что мои функции Sum, Difference и т. Д. Не являются членами класса шаблона, который я создал.'Sum': не является членом 'Тип <Object>' - C++ templates

Вот мой код Type.h

#ifndef TYPE_H 
#define TYPE_H 

#include <iostream> 
using namespace std; 

template <typename Object> 
class Type : public Print 
{ 
    public: 
     //Constructor 
     explicit Type(const Object & initValue = Object()) : storedValue(initValue){} 

     //Accessor and Mutator for storedValue 
     const Object & getValue() const; 
     void setValue(const Object & val); 

     //Additional Operations 
     void Sum(const Type<Object> & val); 
     void Difference(const Type<Object> & val); 
     void Product(const Type<Object> & val); 
     void Quotient(const Type<Object> & val); 

    private: 
     Object storedValue; 
}; 

template <typename Object> 
const Object & Type<Object>::getValue() const 
{ return storedValue; } 

template <typename Object> 
void Type<Object>::setValue(const Object & val) 
{ storedValue = val; } 

template <typename Object> 
void Type<Object>::Sum(const Type<Object> & val) 
{ 
    cout << "The sum of " << val << "and " << storedValue << "is " << val += storedValue << endl; 
} 

template <typename Object> 
void Type<Object>::Difference(const Type<Object> & val) 
{ 
    cout << "The difference of " << val << "and " << storedValue << "is " << val -= storedValue << endl; 
} 

template <typename Object> 
void Type<Object>::Product(const Type<Object> & val) 
{ 
    cout << "The product of " << val << "and " << storedValue << "is " << val *= storedValue << endl; 
} 

template <typename Object> 
void Type<Object>::Quotient(const Type<Object> & val) 
{ 
    cout << "The quotient of " << val << "and " << storedValue << "is " << val /= storedValue << endl; 
} 

class Print 
{ 
    public: 
     void printHello(); 
}; 

void Print::printHello() 
{ 
    cout << "Hello" << endl; 
} 

#endif 

Вот код для TypeMain.cpp:

#include <iostream> 
#include "Type.h" 
using namespace std; 

int main() 
{ 
    //Starting with int operations 
    Type<int> num1(3); 
    Type<int> num2; 

    num2.setValue(4); 
    num2.Sum(num1); 
    num2.Difference(num1); 
    num2.Product(num1); 
    num2.Quotient(num1); 

    //Double operations 
    Type<double> num3(3.3); 
    Type<double> num4; 

    num4.setValue(4.4); 
    num4.Sum(num3); 
    num4.Difference(num3); 
    num4.Product(num3); 
    num4.Quotient(num3); 

    //Hello prints for each object 
    num1.printHello(); 
    num2.printHello(); 
    num3.printHello(); 
    num4.printHello(); 

    return 0; 
} 

Edit: Я обновил код, что я фиксированы. У меня больше нет ошибок с передаваемыми переменными. Тем не менее, я все же имею исходную ошибку, когда функции не являются членами типа

+0

У вас есть несколько вызовов функций, отсутствующих в их аргументах, те, у которых не всегда есть правильные аргументы, вы пытаетесь изменить постоянные объекты, и у вас отсутствует скобка вокруг выражений. –

+0

Да, я знаю о звонках. Эта часть кода еще не закончена, я пытаюсь исправить первую ошибку, потому что я перехожу к ней. – Sean

+0

Вы должны создать [MCVE], чтобы мы могли вам помочь. Я не могу воспроизвести проблему, и я не знаю, действительно ли вызывает ее одна из других проблем. –

ответ

3

Удалить дополнительную квалификацию Type<Object>:: для объявления функции-члена внутри класса.

void /*Type<Object>::*/ Sum(const Object & val); 

И Sum предполагается принять Object (т.е. int для Type<int>), но вы передаете Type<int> к нему, это несоответствие.

+0

Хорошо, я сделал это, но я все еще получаю ту же ошибку. – Sean

+0

@Sean Я попробовал минимальный образец [здесь] (http://rextester.com/NNYNH25237), в чем разница между ним и вашим кодом? – songyuanyao

+0

@songyuanyao отличие состоит в том, что ваш код выполняет 'Sum (1)', тогда как его код выполняет 'Sum (num1)' –

0

Когда вы объявляете функции внутри Type, вы не должны добавлять их к Type<Object>::. То есть ваша декларация для setValue должна быть void setValue(const Object & val);

+0

Хорошо, я сделал это, но я все еще получаю ту же ошибку. – Sean

2

Есть два вопроса:

1) Удалите Type<Object>:: из определений функций-членов в файле заголовка.

2) В main вы не вызываете свои функции с правильным типом параметра. Например:

Type<int> num1(3); 
Type<int> num2; 
num2.Sum(num1); 

Это неверно, так как Sum является шаблонный, поэтому Sum имеет следующее определение:

template <typename Object> 
class Type : public Print 
{ 
    ... 
    void Sum(const Object& val); 
}; 

Таким образом, при создании экземпляра Sum на самом деле это:

void Sum(const int& val); 

Так Sum принимает const int&, а не Type<int>

+0

Так что я должен изменить все (const Object ..) на (const Тип ..)? – Sean

+0

@Sean Depends, вы хотите, чтобы они взяли 'Object' или' Type '? – immibis

+0

Они должны принимать тип . Я обновил свой код, чтобы показать это. – Sean

Смежные вопросы