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 *'
Зачем?
Проблема в том, что это фактически не анализируется как вызов конструктора, а как определение переменной. Проблема в том, что вы уже определили переменную 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 дали мне ясную ошибку.
ваш синтаксис в создании структуры является неправильным.
изменение
MyString<char>(narrow_str); // error C2040
в
MyString<char> myString(narrow_str);
будет в порядке.