【问题标题】:error:expected";" at end of member declaration and expected unqualified id before token "<"错误:预期“;”在成员声明的末尾和令牌“<”之前的预期不合格 id
【发布时间】:2021-10-31 16:28:21
【问题描述】:

我正在尝试编写一个包含友元函数排序的向量类(算法是冒泡排序),但我在这个函数中遇到了一些困难。这个排序函数也是模板迭代器的模板函数,迭代器是类向量中T*的typedef。以下是我的代码:

namespace THU {
template <class T>
void iswap(T* a, T* b) {
    T tmp = *a;
    a = b;
    b = &tmp;
}
template <class T>
class iVector {
   protected:
    int _size;
    int use;
    T* _vector;

   public:
    typedef T* iterator;
    iVector(int n) : _size(n) {
        _vector = new T[n];
        use = 0;
    }
    iterator begin() { return _vector; }
    iterator end() { return begin() + use; }
    void clear() { use = 0; }
    bool empty() const {
        if (use == 0)
            return true;
        else
            return false;
    }
    void pop_back() {
        if (use > 0) {
            use -= 1;
        } else
            throw use;
    }
    void push_back(const T& v) {
        if (use < _size) {
            _vector[use] = v;
            use++;
        } else
            throw use;
    }
    T& operator[](int n) {
        if (n >= 0 && n < use) {
            return _vector[n];
        } else
            throw use;
    }
    friend void sort<iterator>(iterator begin, iterator end);
    void print() {
        for (int i = 0; i < use; i++)
            std::cout << _vector[i] << " ";
        std::cout << std::endl;
    }
};
template <class iterator>
void sort(iterator begin, iterator end) {
    iterator i = end - 1;
    for (; i != begin; i--) {
        iterator j = begin;
        for (; j != i; j++) {
            if (*j > *(j + 1))
                iswap(j, j + 1);
        }
    }
}
}  // namespace THU

并且它在标题中遇到错误。谁能帮帮我?

【问题讨论】:

  • 两个错误都在friend void sort&lt;iterator&gt;的位置
  • 您为什么认为sort 需要成为朋友?它不访问iVector 的任何成员。

标签: c++ oop templates vector friend


【解决方案1】:

需要提前声明sort;或者直接将sort的定义移到iVector的定义之前。例如

template <class iterator>
void sort(iterator begin, iterator end);

template <class T>
class iVector {
    ...
    friend void sort<iterator>(iterator begin, iterator end);
    ...
};

...

如果要声明template friend,应该是

template <class T>
class iVector {
    ...
    // friend declaration
    template <class iterator>
    friend void sort(iterator begin, iterator end);
    ...
};

// definition
template <class iterator>
void sort(iterator begin, iterator end) {
    ...
}

【讨论】:

  • 哇,非常感谢!它真的成功了。那么为什么会发生这种情况呢?通常,我们在类中先声明一个友元函数,然后编写它的定义?
  • @dubugger 答案已修改。
猜你喜欢
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
相关资源
最近更新 更多