0
template<class CharType> 
struct MyString 
{ 
    MyString() 
    {} 

    MyString(CharType*) 
    {} 
}; 

int main() 
{ 
    char* narrow_str = 0; 
    MyString<char>(narrow_str); // error C2040 
} 

我的編譯器是VC++ 2013 RC。爲什麼最簡單的C++代碼不能編譯?

最簡單的代碼由於錯誤C2040而無法編譯。

錯誤C2040: 'narrow_str': 'MyString的' 從 '字符*'

爲什麼 間接的級別不同?

+0

你認爲構造函數調用實際上不是 – aaronman

回答

2

問題是這實際上不是作爲構造函數調用進行分析,而是作爲變量定義進行分析。問題是你已經定義了一個變量narrow_str。您可能已經知道這一點,但您可以通過給它起個名字來輕鬆解決此問題。

template<class CharType> 
struct MyString 
{ 
    MyString() 
    {} 

    MyString(CharType*) 
    {} 
}; 

int main() 
{ 
    char* narrow_str = 0; 
    MyString<char> ns(narrow_str); // error C2040 
} 

順便說一句,這也是當這種類型的語法在一個函數的參數被用於其中發生最令人煩惱的解析的來源。

說實話,雖然我很驚訝,你得到了一個不同的錯誤,因爲g ++和叮噹都給了我一個明確的錯誤。

0

您在創建結構中的語法是錯誤的。
變化

MyString<char>(narrow_str); // error C2040 

MyString<char> myString(narrow_str); 

都會好的。

+0

我想他知道他可以這樣做,但想知道爲什麼第一個不編譯,他認爲他正在創建一個臨時 – aaronman