2010-06-22 41 views
0

我試圖從基類調用一個派生類的非成員函數,但得到這個錯誤訪問派生類的非成員函數:從基類

error: no matching function for call to 'generate_vectorlist(const char&)'

下面是相關的代碼片段從基類:

//Element.cpp 
#include "Vector.h" 
    ... 

string outfile; 
cin >> outfile; 
const char* outfile_name = outfile.c_str(); 
generate_vectorlist(*outfile_name); //ERROR 
... 

和派生類(這是一個模板類,所以一切的在報頭):

//Vector.h 
    template <class T> 
void generate_vectorlist(const char* outfile_name = "input.txt") 
{ 
    std::ofstream vectorlist(outfile_name); 
    if (vectorlist.is_open()) 
     for (Element::vciter iter = Element::vectors.begin(); iter!=Element::vectors.end(); iter++) 
     { 
      Vector<T>* a = new Vector<T>(*iter); 
      vectorlist << a->getx() << '\t' << a->gety() << '\t'<< a->getz() << std::endl; 
      delete a; 
     } 
    else { std::cout << outfile_name << " cannot be opened." << std::endl;} 
    vectorlist.close(); 
} 

我的猜測是我錯過了一小段語法。有任何想法嗎?

+3

「派生類的非成員函數」是什麼?類不能有非成員函數;非成員函數的定義是它不是成員。你的意思是一個靜態成員函數嗎? – 2010-06-22 01:59:53

+0

派生類的非成員函數對於「在特定類頭/源文件中定義的非成員函數」是一個壞詞。如果這意味着一個靜態成員函數,那麼是的,是的,我的意思是! – 2010-06-22 02:12:09

回答

3

您正在取消引用指針,以便傳遞一個const char而不是const char *。

試試這個:

generate_vectorlist(outfile_name); 
3

你有兩個問題:

  1. generate_vectorlist需要const char *,而不是一個const char &

  2. 模板類型不在函數簽名中,因此編譯器無法推導出類型,因此您需要指定它(在我的示例中使用int)。

所以,你需要做的:

generate_vectorlist<int>(outfile_name); 
1

在第一位,試試: generate_vectorlist(outfile_name);

您應該傳遞一個字符指針,而不是一個字符。

1

您需要指定模板參數。編譯器無法用來推斷出什麼類型的T。因此,您必須將其稱爲generate_vectorlist<MyType>(outfile_name);,使用MyType的適當類型。

1

這就是問題所在:

template <class T> 
void generate_vectorlist(const char* outfile_name = "input.txt") 

編譯器不能推斷T的類型,所以它不知道要使用哪個generate_vectorlist

這樣稱呼它:

generate_vectorlist<vectortype>(outfile_name); 

儘管我真的認爲,這代碼不作擺在首位任何意義。