Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么最简单的C++;代码不能被编译吗? 模板 结构MyString { MyString() {} MyString(图表类型*) {} }; int main() { 字符*窄字符=0; MyString(窄字符串);//错误C2040 }_C++_Templates_Compiler Errors_Temporary Objects_Type Deduction - Fatal编程技术网

C++ 为什么最简单的C++;代码不能被编译吗? 模板 结构MyString { MyString() {} MyString(图表类型*) {} }; int main() { 字符*窄字符=0; MyString(窄字符串);//错误C2040 }

C++ 为什么最简单的C++;代码不能被编译吗? 模板 结构MyString { MyString() {} MyString(图表类型*) {} }; int main() { 字符*窄字符=0; MyString(窄字符串);//错误C2040 },c++,templates,compiler-errors,temporary-objects,type-deduction,C++,Templates,Compiler Errors,Temporary Objects,Type Deduction,我的编译器是VC++2013 RC 由于错误C2040,无法编译最简单的代码 错误C2040:“窄字符串”:“MyString”的级别不同 来自“char*”的间接寻址 为什么?问题在于,这实际上不是作为构造函数调用解析的,而是作为变量定义解析的。问题是您已经定义了一个变量窄\u str。您可能已经知道这一点,但您可以通过给它命名来轻松修复它 template<class CharType> struct MyString { MyString() {} M

我的编译器是VC++2013 RC

由于错误C2040,无法编译最简单的代码

错误C2040:“窄字符串”:“MyString”的级别不同 来自“char*”的间接寻址


为什么?

问题在于,这实际上不是作为构造函数调用解析的,而是作为变量定义解析的。问题是您已经定义了一个变量
窄\u str
。您可能已经知道这一点,但您可以通过给它命名来轻松修复它

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

    MyString(CharType*)
    {}
};

int main()
{
    char* narrow_str = 0;
    MyString<char>(narrow_str); // error C2040
}
模板
结构MyString
{
MyString()
{}
MyString(图表类型*)
{}
};
int main()
{
字符*窄字符=0;
MyString ns(窄字符串);//错误C2040
}
顺便说一句,这也是函数参数中使用这种语法时最麻烦的解析的来源


老实说,我很惊讶您会出现不同的错误,因为g++和clang都给了我一个明显的错误。

您创建结构的语法是错误的。
改变

MyString(窄字符串);//错误C2040

MyString MyString(窄字符串);

没问题。

你认为的构造函数调用实际上不是我想他知道他可以这样做,但他想知道为什么第一个没有编译,他认为他在创建一个临时调用
template<class CharType>
struct MyString
{
    MyString()
    {}

    MyString(CharType*)
    {}
};

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