2017-08-24 169 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); 
} 

這是目前只是一個小實驗,但隱式轉換是非常neccessary如果StringT<>是服務於預期目的 - 取代了大部分字符數組的一個代碼庫,我在工作

謝謝提前。

+0

是不是你的編譯器抱怨操作符const CharArray()const {return mChars; }引用類型'CharArray'(aka'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.我將它定義爲非常量,因爲您的原始代碼有一些奇怪的常量處理,並且我希望示例能夠作爲您的OP的插件進行編譯。

+0

嗯,出於某種原因,我沒有想到這樣做。這可能是我的實際情況最明智的解決方案。謝謝您的回答! –

+0

如果你順着這條路走,你可以擺脫隱式轉換操作符,並調用重載函數中的訪問器。一般應避免隱式轉換。 – Frank