2013-08-30 57 views
5

我有一个类,我已经写了哪种类型的擦除。公共接口是:为什么这个模糊不清?

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

value(value &&v); 

template <typename T> 
operator T() const; 

当我从一个的std :: string我有没有问题创造价值的实例,一切正常。当我尝试获得的std :: string退了出来,用static_cast<std::string>(val),其中val是正在举行的std :: string值的实例中,我从VS2012以下错误:

错误C2440:'的static_cast:值“不能从转换'到std :: string的”

没有构造函数可采取源类型,或者如果我注释掉的模板转换运算符,并添加operator std::string() const构造函数重载解析模棱两可

然后编译。我认为,std :: string构造函数和模板化的演员操作符之间具有相同的匹配优点。任何人都可以提出发生了什么事以及如何解决它?

+0

错误消息是否显示候选人? –

+3

请提供一个编译示例(尽可能多达相关错误)。 –

+1

这是我写的一个小例子:http://codepad.org/XJ2Jv5fT – Dave

回答

6

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

你的类显然只是用来一次存储一种类型的对象,所以明确说明。一个真正的函数替换转换功能:

template <typename T> 
T get() const; 

现在这样称呼它:

std::string myString = myValue.get<std::string>(); 

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

6

std::string有几个构造函数可以用一个参数调用 - 例如,一个采取const string&,另一个采取const char*。那么T应该解决什么呢?

从C++标准:

5.2.9p4否则,表达式e可以显式转换到使用所述形式static_cast<T>(e)static_cast类型T如果声明T t(e);是良好的,对一些发明临时变量t

在你的情况下,声明std::string t(val);是不合格的。

+0

'std :: string',由演员提供。它的构造依赖于函数中的代码。 –

+0

我可以看到这个答案是什么意思,但对我来说,它选择遵循直接(单阶段)转换为'std :: string'优先于任何间接(两阶段)转换为一个可以传递给'std :: string'构造函数的参数 – Dave

+0

@Neil Kirk:“5.2.9p4否则,表达式'e'可以使用表单的'static_cast'明确地转换为类型'T' (e)'如果声明'T t(e);'是对于一些发明的临时变量't'的格式良好的'static_cast 。在这种情况下,声明'string t(val);'的格式不正确。 –

5

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

static_cast<const std::string&>(val); 
+0

证实http://codepad.org/w7VKXUcs。这很有趣。我不会想到要参考。虽然不是很可读,所以我会在真正的代码中避免它,除非绝对必要。 – Dave

+0

非常有趣和新颖的解决方案! –

相关问题