Почему самый простой код C ++ не может быть скомпилирован?

0
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 *'

Зачем?

Теги:
templates
compiler-errors
temporary-objects
type-deduction

2 ответа

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++, и clang дали мне ясную ошибку.

0

ваш синтаксис в создании структуры является неправильным.
изменение

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

в

    MyString<char> myString(narrow_str); 

будет в порядке.

  • 0
    Я думаю, что он знает, что он мог сделать это, но удивляется, почему первый не компилируется, он думает, что создает временный

Ещё вопросы

Сообщество Overcoder
Наверх
Меню