私はちょうどそれを得るでしょう:なぜ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<>
が意図した目的を果たすのであれば、暗黙的な変換は非常にneccessaryである - 。私はで働いていたコードベースでchar配列のほとんどを交換
感謝あらかじめ。
しかし、私はこれはリファクタリングタスクのためであることを理解し、それはあなたのシナリオでは、おそらく現実的ではないのです
は、演算子constに対して不平を言っているコンパイラではありません。CharArray()const {return mChars; }参照型 'CharArray'(別名char(&)[StringSize] ')の' const '修飾子は無効です –
この問題は、テンプレート化された 'f()'から発生します。 'void f(char(&array)[32])'は正常に動作します。私はこれのための実際のルールを調べて調べます。 – Frank
テンプレートとの[C++暗黙の型変換の可能な重複](https://stackoverflow.com/questions/9787593/c-implicit-type-conversion-with-template) – Frank