c++ - 如何隐式专门化转换?

标签 c++ class templates

使用以下代码,如果我尝试将模板数组转换为 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/

相关文章:

C++ : How to calculate modulo of a number raised to large power?

c++ - 异步网络接口(interface)状态检查

python - 在不创建对象的情况下使用python中类的属性

c++ - 默认构造函数错误,没有用于调用的匹配函数

c++ - 在 C++ 中接受 "anything"的模板

C++ 内存管理和 vector

c++ - Filtergraph 在第一次数据通过后停止

html - CSS - 无序列表 - 类,id 不工作

c++ - 我可以依赖模板类型吗?

c++ - BOOST_FUSION_ADAPT_TPL_STRUCT 和模板数组大小