我如何隐式专门化转换?

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结尾的数组(它不太可能).

Che*_*Alf 5

首先,你有歧义的原因:你提供转换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.