2013-03-14 76 views
2

請看看這個程序,它生成錯誤:無效的用戶定義的轉換

#include <iostream> 
using namespace std; 
    class A 
    { 
    public: 

     virtual void f(){} 
     int i; 
    }; 

    class B : public A 
    { 
    public: 
     B(int i_){i = i_;} //needed 
     B(){}    //needed 
     void f(){} 
    }; 

    int main() 
    { 

     //these two lines are fixed(needed) 
     B b; 
     A & a = b; 

     //Assignment 1 works 
     B b1(2); 
     b = b1; 

     //But Assignment 2 doesn't works 
     B b2(); 
     b = b2; // <-- error 
    } 

在編譯時,我得到以下錯誤:

$ g++ inher2.cpp 
inher2.cpp: In function ‘int main()’: 
inher2.cpp:32:10: error: invalid user-defined conversion from ‘B()’ to ‘const B&’ [-fpermissive] 
inher2.cpp:14:6: note: candidate is: B::B(int) <near match> 
inher2.cpp:14:6: note: no known conversion for argument 1 from ‘B()’ to ‘int’ 
inher2.cpp:32:10: error: invalid conversion from ‘B (*)()’ to ‘int’ [-fpermissive] 
inher2.cpp:14:6: error: initializing argument 1 of ‘B::B(int)’ [-fpermissive] 

你能幫我找到問題?謝謝

+0

當你需要它時,最令人頭痛的解析問題在哪裏? – chris 2013-03-14 06:17:34

+0

@chris首先,我以爲你是在開玩笑,直到我看到答案:)煩人!... :)謝謝 – rahman 2013-03-14 06:23:14

回答

5

你的「B b2();」是C的「傷腦筋的解析」問題++(see here - 的「最棘手的解析」拍攝曖昧語法進一步)。

它看起來像C++編譯器,你正在聲明一個函數(預先聲明)。

檢查出來:

int foo(); //A function named 'foo' that takes zero parameters and returns an int. 

B b2(); //A function named 'b2' that takes zero parameters and returns a 'B'. 

當你以後做:

b = b2; 

它看起來像你想分配功能(B2)給一個變量(b) 。 調用構造零個參數,調用它不使用括號,你會被罰款:

B b2; 

欲瞭解更多信息,請參見:

+2

這不是「最」令人煩惱的解析。這只是令人煩惱的解析! – Nawaz 2013-03-14 06:18:23

+0

糟糕,你是對的。 – 2013-03-14 06:22:35

+0

@Nawaz你是什麼意思:)他鏈接到維基百科的標題說這是「最」令人煩惱! – rahman 2013-03-14 06:25:08

2
B b2(); 

這是一個函數聲明,變量聲明!

函數名稱是b2,它不帶參數,並返回B類型的對象。

在C++中搜索令人頭痛的解析