SSi*_*ht3 2 c++ templates class
使用以下代码,如果我尝试将模板数组转换为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;
}
Run Code Online (Sandbox Code Playgroud)
我需要对代码进行哪些修改才能使代码正确且隐式地解析为std :: string转换函数?特别是给定const TemplateItem*将被视为以null结尾的数组(它不太可能).
首先,你有歧义的原因:你提供转换char*和转换std::string const,并std::string喜欢它们.
顺便说一句,在回答你的问题之前,constin in operator std::string const曾经是一个好主意,由Scott Meyers主持,但现在是ungood:它阻止了有效的移动.
无论如何,重新提出问题,只是避免隐式转换.使这些转换明确.现在我回答了另一个SO问题,有人(我相信这个人在拖钓)评论说C++ 98不支持explicit类型转换运算符.从技术上讲,这是真的,但作为技术评论却非常愚蠢.因为您不需要使用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.
}
Run Code Online (Sandbox Code Playgroud)
干杯和hth.
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |