2015-12-03 22 views
-1

爲應該能夠創建4個類對象並使用模板函數調用不同數據類型的算術運算的類編寫該程序。我的錯誤告訴我,我的Sum,Difference等函數不是我創建的模板類的成員。'Sum':不是'Type <Object>'的成員 - C++模板

這裏是我的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; 
} 

編輯:我已經更新的代碼是什麼,我已經修復。我不再有傳遞變量的錯誤。我仍然有最初的錯誤,其中函數不是類型的成員

+0

您有多個函數調用缺少它們的參數,那些函數不總是有正確的參數,您試圖修改常量對象,並且在表達式周圍缺少括號。 –

+0

是的,我知道電話。代碼的那部分還沒有完成,我試圖解決第一個錯誤,因爲我轉向那個。 – Sean

+0

您應該創建一個[MCVE],以便我們可以爲您提供幫助。我無法重現這個問題,而且我不知道其他問題是否真的會導致這個問題。 –

回答

3

刪除類中成員函數聲明的額外資格Type<Object>::

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

而且Sum應該採取Object(即intType<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 Type ..)? – Sean

+0

@肖恩取決於,你想讓他們採取一個'對象'或'類型'? – immibis

+0

他們應該採取類型's。我已更新我的代碼以顯示此內容。 – Sean