我在與模板,由此,如果你試圖給一個模板函數的字符串參數,編譯器的「Hello World」作爲爲const char [12]的問題。我希望它是const char *。自動轉換爲const char []爲const char *的模板函數
我可以通過靜態鑄造每個字符串爲「爲const char *」「解決」的問題,而是因爲我想用這個作爲一個記錄系統的一部分,使其成爲簡單是一個很大的目標。
自很難解釋我的意思,我想出了一個簡單的再現。你會看到主函數的最後一行不能編譯。
任何幫助,將不勝感激
#include <string>
// Trivial base class so we can use polymorphism
class StoreItemsBase
{
public:
StoreItemsBase() {}
};
// Example of a trivial Templated class to hold some 3 items.
// Intent to have similar classes to hold 4,5..n items
template <typename T1, typename T2, typename T3>
class Store3Items : public StoreItemsBase
{
public:
Store3Items(const T1& t1, const T2& t2, const T3& t3)
:
StoreItemsBase(),
mT1(t1),
mT2(t2),
mT3(t3)
{}
private:
T1 mT1;
T2 mT2;
T3 mT3;
};
// Function to create a pointer to our object with added id
// There would be similar CreateHolderFunctions for 4,5..n items
template <typename T1, typename T2, typename T3>
StoreItemsBase* CreateHolder(const T1& t1, const T2& t2, const T3& t3)
{
return new Store3Items<T1, T2, T3>(t1, t2, t3);
}
int main()
{
int testInt=3;
double testDouble=23.4;
const std::string testStr("Hello World");
StoreItemsBase* Ok1 = CreateHolder(testInt, testDouble, testStr);
StoreItemsBase* Ok2 = CreateHolder(testDouble, testStr, testInt);
StoreItemsBase* Ok3 = CreateHolder(testStr, static_cast<const char*>("Hello there"), testInt);
// If you try a standard string, it compiler complains
// Although I could surround all my strings with the static cast, what I am looking for is a way
// to for the CreateHolder function to do the work for me
StoreItemsBase* NotOk4 = CreateHolder(testStr, "Hello World", testInt);
// Free our objects not shown in the example
}
編譯錯誤是: example.cpp:在構造「Store3Items :: Store3Items(常量T1 &,常量T2 &,常量T3 &)[用T1 = std :: basic_string,T2 = char [12],T3 = int]':T1351 = std :: basic_string,T2 = char [12],T3 = int]' exampl e.cpp:65:74:從這裏實例化 example.cpp:21:11:error:用作初始化程序的數組
const char []與const char *不同。儘管直接投射可能是隱含的,但反過來卻不是。這就像是想要將一個父類投給它的孩子。 –
一般來說,請包含編譯器錯誤信息 - 即使專家將能夠更快地回答您的問題。 – ndkrempel
P.S. char []和char *具有不同的語義 - 是否要Store3Items存儲字符串的副本或指向原始字符串的指針? – ndkrempel