c++与运算符 << 的输入混淆和 []

发布于 2024-09-11 05:05:20 字数 1464 浏览 3 评论 0 原文

我正在尝试将数组元素的值打印为 cout << array[0],(其中数组是使用运算符[]的一些美化类),但 C++ 类型系统似乎令人难以置信地混乱。 GCC 错误是这样的:(

example.cpp:44:20: error: no match for ‘operator<<’ in ‘std::cout << a_0.fixedarr<T, N>::operator[] [with T = int, long unsigned int N = 5ul, size_t = long unsigned int](0ul)’

整个源代码来自更复杂的东西,但我认为我已经将其简化为一个最小的示例)。

#include <assert.h>
#include <cassert>
#include <climits>
#include <cstdio>
#include <iostream>

using namespace std;

template<typename T>
class fixedarrRef{
    T* ref;
    int sz;
    public:
        fixedarrRef(T* t, int psz){ ref = t; sz = psz;}

        T val(){ return ref[0]; }
};

template<typename T, size_t N>
class fixedarr{
    public:
        T arr[N];
        fixedarr(){
            for(int i=0; i<N; ++i){
                arr[i] = 0;
            }
        }
        inline fixedarrRef<T> operator[] (const size_t i) const{
            assert ( i < N);
            return fixedarrRef<T>((T*)&arr[i], N-i);
        }
};

template <typename T>
ostream & operator << (ostream &out, fixedarrRef<T> &v)
{
    return (out << v.val());
}   

int main() {
    fixedarr<int, 5> a_0;
    fixedarrRef<int> r = a_0[0];
    cout << (a_0[0]) << endl;
    // cout << r << endl;
    return 0;
}

请注意,最后的注释代码有效。提前致谢。

I am trying to print a value of an array element as cout << array[0], (where the array is some glorified class using operator[]), but the C++ typing system seems incredibly confusing. The GCC error is this:

example.cpp:44:20: error: no match for ‘operator<<’ in ‘std::cout << a_0.fixedarr<T, N>::operator[] [with T = int, long unsigned int N = 5ul, size_t = long unsigned int](0ul)’

(The entire source comes from something more complicated, but I think I've pared it down to a minimal example).

#include <assert.h>
#include <cassert>
#include <climits>
#include <cstdio>
#include <iostream>

using namespace std;

template<typename T>
class fixedarrRef{
    T* ref;
    int sz;
    public:
        fixedarrRef(T* t, int psz){ ref = t; sz = psz;}

        T val(){ return ref[0]; }
};

template<typename T, size_t N>
class fixedarr{
    public:
        T arr[N];
        fixedarr(){
            for(int i=0; i<N; ++i){
                arr[i] = 0;
            }
        }
        inline fixedarrRef<T> operator[] (const size_t i) const{
            assert ( i < N);
            return fixedarrRef<T>((T*)&arr[i], N-i);
        }
};

template <typename T>
ostream & operator << (ostream &out, fixedarrRef<T> &v)
{
    return (out << v.val());
}   

int main() {
    fixedarr<int, 5> a_0;
    fixedarrRef<int> r = a_0[0];
    cout << (a_0[0]) << endl;
    // cout << r << endl;
    return 0;
}

Note that the commented code at the end works. Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

过期以后 2024-09-18 05:05:20

您应该同时声明 TfixedarrRef::val()fixedarrRef; 运算符 << const 中的 &v

T val() const { return ref[0]; }

template <typename T>
ostream & operator << (ostream &out, const fixedarrRef<T> &v)

You should declare both T fixedarrRef::val() and fixedarrRef<T> &v in operator << const.

T val() const { return ref[0]; }

and

template <typename T>
ostream & operator << (ostream &out, const fixedarrRef<T> &v)
狂之美人 2024-09-18 05:05:20

a_0[0] 返回一个无法绑定到非常量引用的临时对象,因此您的运算符 << 应将其参数作为常量引用。

a_0[0] returns a temporary object which can not be bound to a non-const reference, Hence your operator << should take its parameter as a const reference.

ゝ杯具 2024-09-18 05:05:20

您的 [] 运算符返回 fixedarrRef 类的实例,并且您尝试在此实例上使用运算符 <<

由于没有为 fixedarrRef 定义 << 运算符,您将得到错误。

定义这个运算符,它应该可以工作。

Your [] operator returns an instance of the fixedarrRef class and you are trying to use the operator << on this instance.

Since there is no << operator defined for fixedarrRef you will get and error.

Define this operator and it should work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文