我終于嘗試學習模板,并創建了一個模板函式,該函式將回傳std::vector一個泛型型別。
編譯時出現錯誤:
錯誤:沒有用于呼叫“std::vector::push_back(std::string&)”的匹配函式
std::string除了原始型別之外,模板向量中是否有支持或類似型別的方法?
這是一個由于此錯誤而無法編譯的“最小,可重現的示例”(這顯然不是我的代碼,它只是說明了錯誤):
#include <iostream>
#include <vector>
enum types{
TINT = 0,
TDOUBLE = 1,
TSTRING = 2,
};
class TestClass{
public:
template<typename T> std::vector<T> getData(types type)
{
std::vector<T> entries;
int i_value;
double d_value;
std::string st_value;
switch (type)
{
case types::TINT:
i_value = 1;
entries.push_back(i_value);
break;
case types::TDOUBLE:
d_value = 0.1;
entries.push_back(d_value);
break;
case types::TSTRING:
st_value = "foo";
entries.push_back(st_value); //Pushing an std::string causes a compile error
break;
default:
break;
}
return entries;
}
};
int main()
{
TestClass bar;
std::vector<int> test = bar.getData<int>(types::TINT);
return 0;
}
注釋該行entries.push_back(st_value);會使所有內容再次編譯。
uj5u.com熱心網友回復:
代碼無法編譯,因為您嘗試在運行時檢查型別。這為時已晚。用于std::is_same進行編譯時檢查。
template<typename T> std::vector<T> getData()
{
std::vector<T> entries;
int i_value;
double d_value;
std::string st_value;
if constexpr(std::is_same_v<T, int>) {
i_value = 1;
entries.push_back(i_value);
}
else if constexpr(std::is_same_v<T, double>) {
d_value = 0.1;
entries.push_back(d_value);
}
else if constexpr(std::is_same_v<T, std::string>) {
st_value = "foo";
entries.push_back(st_value);
}
return entries;
}
uj5u.com熱心網友回復:
這一行std::vector<int> test = bar.getData<int>(types::TINT);
導致編譯器將函式擴展為:
// Note: T becomes int
std::vector<int> getData(types type)
{
// Note: T becomes int
std::vector<int> entries;
int i_value;
double d_value;
std::string st_value;
switch (type)
{
case types::TINT:
i_value = 1;
entries.push_back(i_value);
break;
case types::TDOUBLE:
d_value = 0.1;
entries.push_back(d_value);
break;
case types::TSTRING:
st_value = "foo";
entries.push_back(st_value); //Pushing an std::string causes a compile error
break;
default:
break;
}
return entries;
}
這意味著,entries是一個整數向量。它不能拿一個std::string物體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/532074.html
標籤:C 模板
下一篇:在不知道型別的情況下宣告模板指標
