Если вы можете изменить свой Class
, вы можете добавить шаблонный конструктор преобразования. Тогда вы сможете скомпилировать закомментированную строку, как написано в вашем примере. Однако, как правило, не рекомендуется использовать неявные преобразования без уважительной причины, поскольку они могут приводить к трудно обнаруживаемым ошибкам (см. Основные руководящие принципы C ++ ).
#include <string>
#include <iostream>
template <typename Type>
struct Class
{
Type data;
Class(Type data) : data(data) { }
template<typename Other>
Class(Other other_data) : data(other_data) {}
};
int main()
{
Class<std::string> a = std::string("abc");
Class<std::string> b = "abc";
Class<std::string> c = a;
std::cout << b.data << std::endl;
return 0;
}
Если вы можете использовать C ++ 14, вы можете использовать std::literals::string_literals::operator""s
и удалить конструктор преобразования. Тогда ваша строка будет выглядеть так:
using namespace std::literals;
Class<std::string> b = "abc"s;
Живой код здесь .