为什么最简单的C ++代码无法编译?

时间:2013-10-15 01:57:19

标签: c++ templates compiler-errors temporary-objects type-deduction

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

    MyString(CharType*)
    {}
};

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

我的编译器是VC ++ 2013 RC。

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

  

错误C2040:'narrow_str':'MyString'的等级不同   间接来自'char *'

为什么?

2 个答案:

答案 0 :(得分:2)

问题是这实际上并没有被解析为构造函数调用,而是作为变量定义。问题是您已经定义了变量narrow_str。您可能已经知道这一点,但您可以通过给它命名来轻松解决这个问题。

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

    MyString(CharType*)
    {}
};

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

BTW这也是在函数参数中使用这种类型的语法时最烦人的解析的来源。

老实说虽然我很惊讶你有一个不同的错误,因为g ++和clang都给了我一个明确的错误。

答案 1 :(得分:0)

创建结构的语法错误 改变

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

    MyString<char> myString(narrow_str); 

没问题。