【问题标题】:Implicit type conversion to array隐式类型转换为数组
【发布时间】:2017-08-24 21:26:23
【问题描述】:

我会直接说:为什么第 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&lt;&gt; 是为了达到预期目的 - 替换我正在工作的代码库中的大多数 char 数组,则隐式转换是非常必要的。

提前致谢。

【问题讨论】:

  • 你的编译器不是在抱怨 operator const CharArray() const { return mChars;引用类型“CharArray”(又名“char (&)[StringSize]”)上的“const”限定符无效
  • 问题来自 f() 被模板化。 void f(char (&amp;array)[32]) 可以正常工作。我会尝试查找实际规则。
  • 要达到匹配,您必须先应用转换运算符,然后再进行模板推导。这不是事情发生的顺序(除非你明确编码)。
  • @Frank 这听起来像是问题的核心,但有没有办法以某种方式解决它?顺便说一句,虽然建议的副本很有趣,但它似乎描述了不同类型的演绎问题,但我找不到我的特定问题得到充分解释。也许我误解了什么?

标签: c++ arrays templates implicit-conversion


【解决方案1】:

我知道这是针对重构任务的,但是在您的场景中可能不可行:

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

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

注意我将其设为非 const 是因为您的原始代码有一些奇怪的 const 处理,并且我希望将示例编译为您的 OP 的插件。

【讨论】:

  • 嗯,出于某种原因,我没想过这样做。实际上,这可能是我的案例最明智的解决方案。谢谢你的回答!
  • 如果你走这条路,你不妨摆脱隐式转换运算符,并在重载函数中调用访问器。一般应避免隐式转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
相关资源
最近更新 更多