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: «thin_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);
будет в порядке.