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