隐式类型转换为数组

时间:2017-08-24 21:26:24

标签: c++ arrays templates implicit-conversion

我只是直截了当:为什么第38行没有隐式转换为char(&)[32]?

template <size_t StringSize>
struct StringT
{
private:
    char mChars[StringSize];

public:
    // Note: CharArray can decay to char*.
    typedef char (&CharArray)[StringSize];

    CharArray array() { return mChars; }
    operator CharArray() { return mChars; }
    operator const CharArray() const { return mChars; }
};

#include <iostream>

template<size_t Size>
void f(char (&array)[Size])
{
    std::cout << "I am char array with size " << Size << "\n";
}

int main()
{
    StringT<32> someText;

    // Conversion through method compiles.
    f(someText.array());

    // Explicit conversion compiles.
    f((StringT<32>::CharArray)someText);

    // Implicit conversion fails:
    // source_file.cpp(38): error C2672: 'f': no matching overloaded function found
    // source_file.cpp(38): error C2784: 'void f(char (&)[Size])': could not deduce template argument for 'char (&)[Size]' from 'StringT<32>'
    // source_file.cpp(19): note: see declaration of 'f'
    f(someText);
}

目前这只是一个小实验,但如果StringT<>用于预期目的,隐式转换是非常必要的 - 替换我正在使用的代码库中的大多数char数组。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我理解这是针对重构任务的,但在您的方案中可能不可行,但是:

如果您想维护main()函数中显示的界面,则需要创建f()的模板化重载,该重载将在任何隐式转换之前直接解析为StringT<Size>应用

template<size_t Size>
void f(StringT<Size>& v)
{
    f(v.array());
}

N.B。我把它设为非const,因为你的原始代码有一些奇怪的const处理,我希望将样本编译为你的OP的插件。