我會直截了當地說明爲什麼不將第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<>
是服務於預期目的 - 取代了大部分字符數組的一個代碼庫,我在工作
謝謝提前。
是不是你的編譯器抱怨操作符const CharArray()const {return mChars; }引用類型'CharArray'(aka'char(&)[StringSize]')上的'const'限定符不起作用 –
問題來自'f()'模板化。 'void f(char(&array)[32])'可以正常工作。我會嘗試查找實際的規則。 – Frank
[C++隱式類型轉換與模板]的可能重複(https://stackoverflow.com/questions/9787593/c-implicit-type-conversion-with-template) – Frank