【发布时间】: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<> 是为了达到预期目的 - 替换我正在工作的代码库中的大多数 char 数组,则隐式转换是非常必要的。
提前致谢。
【问题讨论】:
-
你的编译器不是在抱怨 operator const CharArray() const { return mChars;引用类型“CharArray”(又名“char (&)[StringSize]”)上的“const”限定符无效
-
问题来自
f()被模板化。void f(char (&array)[32])可以正常工作。我会尝试查找实际规则。 -
要达到匹配,您必须先应用转换运算符,然后再进行模板推导。这不是事情发生的顺序(除非你明确编码)。
-
@Frank 这听起来像是问题的核心,但有没有办法以某种方式解决它?顺便说一句,虽然建议的副本很有趣,但它似乎描述了不同类型的演绎问题,但我找不到我的特定问题得到充分解释。也许我误解了什么?
标签: c++ arrays templates implicit-conversion