使用以下代码,如果我尝试将模板数组转换为 std::string,而不是编译器使用预期的 std::string 转换方法,则会引发歧义解析问题(因为它尝试调用数组转换方法):
#include <iostream>
template<typename TemplateItem>
class TestA
{
public:
TemplateItem Array[10];
operator const TemplateItem *() const {return Array;}
operator const std::string() const;
};
template<>
TestA<char>::operator const std::string() const
{
std::string Temp("");
return Temp;
}
int main()
{
TestA<char> Test2;
std::string Temp("Empty");
Temp = Test2; //Ambiguity error. std::string or TemplateItem * ?
return 0;
}
我需要对代码进行哪些修改才能使代码正确并隐式解析为 std::string 转换函数?特别是考虑到 const TemplateItem * 将被视为以 null 结尾的数组(这不太可能是)。
最佳答案
首先,您有歧义的原因:您提供了到 char*
的转换和到 std::string const
的转换,以及 std::string
两个都喜欢。
顺便说一句,在回答你的问题之前,operator std::string const
中的 const
曾经是一个好主意,例如由Scott Meyers,但现在不好:它阻碍了有效的移动。
无论如何,关于这个问题,只要避免隐式转换即可。明确这些转换。现在我回答了另一个 SO 问题,有人(我相信这个人在恶搞)评论说 C++98 不支持显式类型转换运算符。从技术上来说,这确实是正确的,但作为技术评论却相当愚蠢。因为您不需要使用 explicit
关键字(C++11 支持),而且实际上这并不是使转换显式化的好方法。相反,只需命名这些转换:使用命名成员函数,而不是转换运算符。
#include <iostream>
template<typename TemplateItem>
class TestA
{
public:
TemplateItem Array[10];
TemplateItem const* data() const { return Array; }
std::string str() const;
};
template<>
std::string TestA<char>::str() const
{
return "";
}
int main()
{
TestA<char> test2;
std::string temp( "Empty" );
temp = test2.str(); // OK.
temp = test2.data(); // Also OK.
}
干杯&hth。
关于c++ - 如何隐式专门化转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7680657/