2017-08-24 10 views
0

私はちょうどそれを得るでしょう:なぜ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配列のほとんどを交換

感謝あらかじめ。

しかし、私はこれはリファクタリングタスクのためであることを理解し、それはあなたのシナリオでは、おそらく現実的ではないのです
+0

は、演算子constに対して不平を言っているコンパイラではありません。CharArray()const {return mChars; }参照型 'CharArray'(別名char(&)[StringSize] ')の' const '修飾子は無効です –

+0

この問題は、テンプレート化された 'f()'から発生します。 'void f(char(&array)[32])'は正常に動作します。私はこれのための実際のルールを調べて調べます。 – Frank

+0

テンプレートとの[C++暗黙の型変換の可能な重複](https://stackoverflow.com/questions/9787593/c-implicit-type-conversion-with-template) – Frank

答えて

0

あなたmain()機能に示すようにインターフェースを維持したい場合は、テンプレートオーバーロードを作成する必要がありますf()であり、暗黙の変換が適用される前に直接StringT<Size>に解決されます。

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

N.B.元のコードには奇妙なconst処理が含まれているため、非constにしました。サンプルをコンパイルしてOPにドロップインしたいと思っていました。

+0

ええと、何らかの理由で私はこのようにするとは思わなかった。これはおそらく実際に私の場合の最も賢明な解決策です。あなたの答えをありがとう! –

+0

もしあなたがその道を辿ると、暗黙の変換演算子を取り除いて、オーバーロードされた関数内のアクセサを呼び出すこともできます。暗黙の変換は一般的に避けるべきです。 – Frank

関連する問題