Это упрощенная версия моей системы типов:
#include <string>
#include <vector>
template<typename T>
class Box {
public:
Box(const T& value) : _value(value) {};
private:
T _value;
/* ... */
};
typedef Box<int> Int;
typedef Box<double> Double;
typedef Box<std::string> String;
int main(int argc, char* argv[]) {
String a("abc");
std::vector<String> b = { std::string("abc"), std::string("def") };
// error C2664: 'Box<std::string>::Box(const Box<std::string> &)' : cannot convert argument 1 from 'const char' to 'const std::string &'
std::vector<String> c = { "abc", "def" };
}
В то время как a
и b
компилируются, c
нет, и причина, по-видимому, в том, что я пытаюсь инициализировать из const char
. Это вызывает два вопроса:
Почему
b
можно, аc
нельзя? Это из-за вложенного шаблона вstd::vector<Box<std::string> >
?Могу ли я заставить работать
c
, не разрушая общий механизм бокса (ср.typedef Box<double> Double
?
main.cpp:18:12: error: no viable conversion from 'const char [4]' to 'String' (aka 'Box<basic_string<char> >') String a = "abc";
(сообщения об ошибках меняются между компиляторами, но ошибка одна и та же). Может быть, ошибка в том, что вы не можете использовать неявное преобразование (путем вызова конструктора или с помощью определяемого пользователем оператора приведения) с шаблоном? - person nefas   schedule 22.05.2017