這是我期望實作的功能:
darray<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
std::cout << a << std::endl; // displays: {1, 2, 3}
我的實施:
template <typename T>
class darray
{
private:
long m_capacity;
long m_size;
T* m_data;
void resize();
public:
// constructors & destructors
darray();
// operations
void push_back(T);
std::ostream& print(std::ostream&) const;
template<typename U> friend std::ostream& operator<<(std::ostream& os, U const& ar);
};
template<typename T>
std::ostream& darray<T>::print(std::ostream& os) const
{
os << "{ ";
for (size_t i = 0; i < m_size; i )
{
os << m_data[i] << ", ";
if ( i == m_size - 1 )
os << m_data[i];
}
os << " }\n";
return arr;
}
template<typename U>
std::ostream& operator<<(std::ostream& os, U const& obj)
{
return obj.print(os);
}
產生錯誤:
error: ambiguous overload for ‘operator<<’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream<char>’} and ‘const char [66]’)
但是,當我更改 operator<< 的引數以接受darray<U>instead 時,它作業正常:
template<typename U>
std::ostream& operator<<(std::ostream& os, darray<U> const& obj)
{
return obj.print(os);
}
我在這里錯過了什么?
更新:
我也嘗試這樣做,將引數更改為darray<U>在定義和實作中鍵入,但它仍然會產生相同的錯誤:
template <typename T>
class darray
{
private:
long m_capacity;
long m_size;
T* m_data;
void resize();
public:
// constructors & destructors
darray();
// operations
void push_back(T);
std::ostream& print(std::ostream&) const;
template<typename U> friend std::ostream& operator<<(std::ostream& os, darray<U> const& ar);
};
template<typename T>
std::ostream& darray<T>::print(std::ostream& os) const
{
os << "{ ";
for (size_t i = 0; i < m_size; i )
{
os << m_data[i] << ", ";
if ( i == m_size - 1 )
os << m_data[i];
}
os << " }\n";
return os;
}
template<typename U>
std::ostream& operator<<(std::ostream& os, darray<U> const& obj)
{
return obj.print(os);
}
uj5u.com熱心網友回復:
模板類中的友元函式必須在類宣告中定義。這是我發現讓友元函式正確接受具有預期模板的模板類實體的唯一方法。
所以在這里我會寫:
...
friend std::ostream& operator<<(std::ostream& os, darray<T> const& ar) {
ar.print(os);
return os;
}
...
但要注意:你的類包含一個指向分配記憶體的原始指標,它可能在類解構式中被洗掉。根據五的規則,您必須明確宣告(或洗掉)復制/移動建構式和賦值運算子。
uj5u.com熱心網友回復:
在你的darray<T>::print功能中,如果你改變
os << m_data[i] << ", ";
至
os << m_data[i];
os << ", ";
然后編譯器不會抱怨并且作業正常。我不知道為什么。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/534070.html
上一篇:沒有引數的模板引數包擴展
