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

0

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

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

в

MyString<char> myString(narrow_str); 

будет хорошо.

+0

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

Смежные вопросы