为什么这个模糊不清?

Gra*_*rak 5 c++ c++11

我有一个我写过的类,它可以进行类型擦除.公共界面是:

template <typename T>
value(const T &t);

value(value &&v);

template <typename T>
operator T() const;
Run Code Online (Sandbox Code Playgroud)

当我从std :: string创建一个值实例时,我没有问题,一切都按预期工作.当我尝试将std :: string退出时,使用static_cast<std::string>(val),其中val是一个包含std :: string的值的实例,我从VS2012获得以下错误:

错误C2440:'static_cast':无法从'value'转换为std :: string'

没有构造函数可以采用源类型,或构造函数重载解析是不明确的

如果我注释掉模板化的强制转换操作符并添加operator std::string() const则编译.我认为std :: string构造函数和模板化的强制转换运算符之间的某些东西具有相同的匹配优势.任何人都可以建议发生了什么以及如何解决它?

Igo*_*nik 6

std::string有几个构造函数能够用一个参数调用 - 例如一个参与const string&,另一个参与const char*.那应该T解决什么呢?

从C++标准:

5.2.9p4否则,对于某些发明的临时变量,如果声明格式正确,则表达式e可以T使用static_cast表单的a显式转换为类型.static_cast<T>(e)T t(e);t

在您的情况下,声明std::string t(val);是不正确的.


Dav*_*ave 6

伊戈尔解释了这个问题.这是我建议的解决方案:

您的类显然只打算一次存储一种类型的对象,因此请明确说明.用实际函数替换转换函数:

template <typename T>
T get() const;
Run Code Online (Sandbox Code Playgroud)

现在称它为:

std::string myString = myValue.get<std::string>( );
Run Code Online (Sandbox Code Playgroud)

没有歧义.没有机会调用错误的功能并弄乱一切.我认为它现在更具可读性.


Jar*_*d42 5

以下是使用std :: string(如果可以返回引用).

static_cast<const std::string&>(val);
Run Code Online (Sandbox Code Playgroud)