我想有兩個模板結構可以將任何Variant類型轉換爲std::strings
;如何使用模板類型的向量?
雖然第一個編譯,第二個不會編譯,在vector<Variant>::iterator statement
。編譯器說:
error: expected ';' after expression
vector<Variant>::iterator i = data.begin();
任何想法,我究竟做錯了什麼?有沒有更好的辦法來解決我在這裏要做的事情?
template <typename Variant>
struct to_string
{
private:
Variant data;
public:
to_string(Variant &d) : data(d) {}
operator std::string() const
{
try
{
return boost::lexical_cast<std::string>(data);
}
catch (const boost::bad_lexical_cast &)
{
return std::string();
}
}
};
template <typename Variant>
struct to_string_vector
{
private:
vector<Variant> data;
public:
to_string_vector(vector<Variant> &d) : data(d) {}
operator vector<std::string>() const
{
vector<string> ret;
vector<Variant>::iterator i = data.begin();
to_string t_s<Variant> s = to_string<Variant>(*i);
ret.push_back((string)s);
return ret;
}
};
擴大這個;如果沒有'typename',編譯器會認爲'vector :: iterator'是一個變量名,因此是錯誤信息。畢竟你可以用'vector'的專門化來調用這個模板,在這裏你有一個名爲'iterator'的變量。這些規則的設計使編譯器可以進行一些檢查,甚至可以對模板進行部分編譯,而無需知道將使用哪種類型進行實例化。 –
非常感謝您的答覆和解決! :-)如果你有一個更優雅或通用的方法來做同樣的事情的想法,請張貼:) – user3211860