2016-03-30 27 views
0

在從基類模板類派生的類中,我重寫了方法createType()。當我嘗試訪問派生類的createType(int)時,編譯器說它不存在。爲什麼?從模板基類中覆蓋方法時的問題

template <class T> 
class BaseClass 
{ 
public: 
    virtual T createType(){ return T(); } 
    virtual T createType(int){ return T(); } 
}; 

class Point 
{ 
public: 
    float x, y; 
}; 

class PointFactory : public BaseClass<Point> 
{ 
public: 
    virtual Point createType() { return BaseClass::createType(); } 
}; 

int main() 
{ 
    PointFactory pf; 
    auto p = pf.createType(5); // error here 
    return 0; 
} 

我得到的錯誤是

錯誤C2660: 'PointFactory :: createType':函數不接受1個參數

+1

什麼是實際的錯誤信息? – NathanOliver

+1

請編輯您的問題,以包含*完整*錯誤信息,完整,未經編輯,並附帶任何可能的信息說明。 –

+1

如果您覆蓋,您應該使用'override'。 –

回答

7

virtual Point PointFactory::createType()隱藏基重載。

您可以添加using BaseClass<Point>::createType;來解決這個問題:

class PointFactory : public BaseClass<Point> 
{ 
public: 
    using BaseClass<Point>::createType; // unhide overloads 

    Point createType() override { return BaseClass::createType(); } 
}; 
+1

毆打我8秒! :)我會刪除我的答案。 – SergeyA

+0

能否請你向我介紹一下如何在類聲明裏面聲明它和它之外的地方,謝謝 – fatehmtd

+0

完美,謝謝。當我能找到關於這個問題的更多信息時,你有鏈接嗎? – fatehmtd

0

除了壓倒一切的,您有其他兩個問題:

  1. 您調用帶參數的子類函數,但孩子-class沒有帶有整數參數的名稱的成員函數。

  2. return T;?如果T是例如int那麼這將是return int;,你會如何期待這種工作?這會導致基類中的函數不存在,並且可能會給您提供類似的錯誤,以至於您詢問關於該函數的一切。

+0

我剛剛寫下這個例子只是爲了能夠清楚地揭露問題,實際的實現是一個非常大的代碼,並且只使用了類 – fatehmtd

+1

@fatehmtd無關的錯誤分散了實際問題,特別是因爲我描述的兩個問題都可能給你帶來錯誤類似於重寫錯誤的消息。這就是爲什麼創建一個[最小,完整和可驗證示例]非常重要(http:// stackoverflow。com/help/mcve),並且在出現構建錯誤的情況下創建一個只包含您所問的錯誤。 –

+0

你是對的,謝謝你的編輯。 – fatehmtd

0

這可能是更清晰的檢查用g ++報告的錯誤:

g++ -std=c++11 -g -Wall -Wextra -Wwrite-strings -c -o 36315450.o 36315450.cpp 
36315450.cpp: In function ‘int main()’: 
36315450.cpp:24:29: error: no matching function for call to ‘PointFactory::createType(int)’ 
    auto p = pf.createType(5); // error here 
          ^
36315450.cpp:24:29: note: candidate is: 
36315450.cpp:18:19: note: virtual Point PointFactory::createType() 
    virtual Point createType() { return BaseClass::createType(); } 
       ^
36315450.cpp:18:19: note: candidate expects 0 arguments, 1 provided 
make: *** [36315450.o] Error 1 

因爲你重寫createType(),然後createType(int)被遮蔽。這將無法訪問,除非你在派生類中重新實現它,可能使用using

class PointFactory : public BaseClass<Point> 
{ 
public: 
    virtual Point createType() { return Point(0,0); } 
    using BaseClass<Point>::createType; 
}; 

我所做的首要createType()做比通過基類以外的東西,否則這將是在這裏多餘!