2012-08-26 27 views
4
class Sample 
{ 
public: 
    Sample(); 
    Sample(int i); 
    Sample(Sample& s); 
    ~Sample(); 
}; 

Sample::Sample() 
{ 
    cout<<"Default constructor called\n"; 
} 

Sample::Sample(int i) 
{ 
    cout<<"1-argument constructor called\n"; 
} 

Sample::Sample(Sample& s) 
{ 
    cout<<"Copy constructor called\n"; 
} 

Sample::~Sample() 
{ 
    cout<<"Destructor called\n"; 
} 

void Fun(Sample s) 
{ 

} 

int main() 
{ 
    Sample s1; 
    Fun(5); 

    return 0; 
} 

我預計5 但是,隱式轉換當我編譯上面的代碼中,我得到以下錯誤:錯誤自動轉換

main.cpp:7:8: error: no matching function for call to ‘Sample::Sample(Sample)’ 
main.cpp:7:8: note: candidates are: 
Sample.h:10:3: note: Sample::Sample(Sample&) 
Sample.h:10:3: note: no known conversion for argument 1 from ‘Sample’ to ‘Sample&’ 
Sample.h:9:3: note: Sample::Sample(int) 
Sample.h:9:3: note: no known conversion for argument 1 from ‘Sample’ to ‘int’ 
Sample.h:8:3: note: Sample::Sample() 
Sample.h:8:3: note: candidate expects 0 arguments, 1 provided 
Helper.h:6:13: error: initializing argument 1 of ‘void Fun(Sample)’ 

問題是什麼?當我刪除複製構造函數時,上面的代碼編譯成功。

在此先感謝。

+1

爲什麼「有趣(5);」調用「Sample :: Sample(int i)」?如何在這種情況下轉換工作? – URL87

+0

@ URL87有一個參數構造函數,如果沒有標記爲明確的,應該調用它。但是,在這裏扮演什麼角色來複制構造函數而不讓代碼編譯,這是我的困惑。 – abhithakur88

回答

6

臨時不能綁定到非const引用。你的拷貝構造函數應該是:

Sample::Sample(const Sample&) 

刪除它告訴編譯器生成一個簡單的一個,這將有上面簽名。

+0

如果我刪除拷貝構造函數,它會調用1個arg構造函數,以便使用1-arg構造函數從int 5隱式轉換爲Sample對象。但是,當我添加上面的複製構造函數,它開始報告錯誤。當它的轉換可以簡單地使用1-arg構造函數完成時,就像添加上面的拷貝構造函數一樣,它爲什麼會開始混淆拷貝構造函數。 – abhithakur88

+0

您提供的代碼不會執行任何操作... –

+0

@ abhithakur88這意味着您必須提供更多上下文 - 如何調用函數等。 –