当前位置: 首页 > 知识库问答 >
问题:

运算符

秦英发
2023-03-14

我试图将我的模板化类的模板化成员函数的声明和定义分开,但最终出现了以下错误和警告。

template <typename I>
class BigUnsigned{
    const size_t cell_size=sizeof(I);
    std::vector<I> _integers;
public:
    BigUnsigned();
    BigUnsigned(I);
    friend std::ostream& operator<<(std::ostream& out, const BigUnsigned& bu);
};

std::ostream& operator<<(std::ostream& out, const BigUnsigned& bu){
    for (auto integer : bu._integers){
        out<<integer<<std::endl;
    }
    return out;
}

../HW06/BigUnsigned.h:13:77:警告:友元声明“std::oStream&operator<<(std::oStream&,const BigUnsigned&)”声明了一个非模板函数[-wnon-template-friend]友元std::oStream&operator<<(std::oStream&out,const BigUnsigned&bu);^../Hw06/BigUnsigned.h:13:77:注意:(如果这不是您想要的,请确保函数模板已经声明,并在此处的函数名后面添加<>)../Hw06/BigUnsigned.h:16:51:错误:在没有参数列表的情况下使用模板名“BigUnsigned”无效<<(std::Ostream&out,const BigUnsigned&bu){^../Hw06/BigUnsigned.h:In函数“std::Ostream&out,const Int&)”:../Hw06/BigUnsigned.h:在“bu”中请求成员“_integers”,该成员是非类

当我加入这样的声明和定义时,一切都编译得很好。

template <typename I>
class BigUnsigned{
    const size_t cell_size=sizeof(I);
    std::vector<I> _integers;
public:
    BigUnsigned();
    BigUnsigned(I);
    friend std::ostream& operator<<(std::ostream& out, const BigUnsigned& bu){
        for (auto integer : bu._integers){
            out<<integer<<std::endl;
        }
        return out;
    }
};

目的是将成员variableintegers打印到cout。可能是什么问题?

附注:使用这个问题,我使函数免费,但没有帮助。

共有3个答案

雍马鲁
2023-03-14

要添加第三个改进可读性的变体,请在类中定义friend函数:

#include <iostream>

template <typename T>
class Foo {
    int test = 42;

    // Note: 'Foo' inside the class body is basically a shortcut for 'Foo<T>'
    // Below line is identical to: friend std::ostream& operator<< (std::ostream &os, Foo<T> const &foo)
    friend std::ostream& operator<< (std::ostream &os, Foo const &foo) {
        return os << foo.test;
    }
};


int main () {
    Foo<int> foo;
    std::cout << foo << '\n';
}
郎雪风
2023-03-14

NathanOliver对答案的改进。

对于另一个答案,函数模板的所有实例化都是类模板的所有实例化的friends。

运算符< bigunsigned bigunsigned 朋友

运算符< bigunsigned 以及bigunsigned 友元

您可以稍微更改声明,以便

运算符< bigunsigned 朋友但不是bigunsigned 的。

运算符< bigunsigned 友元但不是bigunsigned

// Forward declaration of the class template.
template <typename I> class BigUnsigned;

// Forward declaration of the function template
template <typename I>
std::ostream& operator<<(std::ostream& out, const BigUnsigned<I>& bu);

// Change the friend-ship declaration in the class template.
template <typename I>
class BigUnsigned{
    const size_t cell_size=sizeof(I);
    std::vector<I> _integers;
public:
    BigUnsigned();
    BigUnsigned(I);

    // Grant friend-ship only to a specific instantiation of the
    // function template.
    friend std::ostream& operator<< <I>(std::ostream& out, const BigUnsigned<I>& bu);
};
农星华
2023-03-14

bigunsigned是模板类型,因此

std::ostream& operator<<(std::ostream& out, const BigUnsigned& bu)

不会工作,因为没有bigunsigned。您需要使friend函数成为一个模板,以便可以使用不同类型的bigunsigned

template <typename I>
class BigUnsigned{
    const size_t cell_size=sizeof(I);
    std::vector<I> _integers;
public:
    BigUnsigned();
    BigUnsigned(I);
    template<typename T>
    friend std::ostream& operator<<(std::ostream& out, const BigUnsigned<T>& bu);
};

template<typename T>
std::ostream& operator<<(std::ostream& out, const BigUnsigned<T>& bu){
    for (auto integer : bu._integers){
        out<<integer<<std::endl;
    }
    return out;
}

第二个示例起作用的原因是,由于它是在类内部声明的,所以它使用了类使用的模板类型。

 类似资料:
  • 运算符是处理数据的基本方法,用来从现有的值得到新的值。JavaScript 提供了多种运算符,覆盖了所有主要的运算。 概述 JavaScript 共提供10个算术运算符,用来完成基本的算术运算。 加法运算符:x + y 减法运算符: x - y 乘法运算符: x * y 除法运算符:x / y 指数运算符:x ** y 余数运算符:x % y 自增运算符:++x 或者 x++ 自减运算符:--x

  • void 运算符 void运算符的作用是执行一个表达式,然后不返回任何值,或者说返回undefined。 void 0 // undefined void(0) // undefined 上面是void运算符的两种写法,都正确。建议采用后一种形式,即总是使用圆括号。因为void运算符的优先性很高,如果不使用括号,容易造成错误的结果。比如,void 4 + 7实际上等同于(void 4) + 7。

  • 我做了这个密码 声明: 功能: 主要内容: 我得到这个错误: 错误1错误LNK2019:未解析的外部符号“class std::basic\U ostream 我试图在没有朋友的情况下写它,但却出现了另一个错误<我做错了什么?

  • 我相信这个片段足以分析错误。 编译代码时,会出现以下错误: 错误:传递'const EventClass'作为'std::字符串EventClass::getEventName()'的'this'参数丢弃限定符[-fpermissive] outStream 错误:传递'const EventClass'作为'int EventClass::getEventTime()'的'this'参数丢弃限定

  • 我正在学习C++中的运算符重载,我想知道下面代码的输出 我想知道,如果重载一个“<<”运算符以只打印一个参数int(显而易见),并且只想单独打印一个数字,如上面提到的代码中的“cout<<10”int会发生什么。那么编译器将如何决定,当我试图打印任何整数时,应该调用哪个函数。

  • Jesus answered them, "Those who are well don't need a physician, but those who are sick do. I have not come to call the righteous, but sinners to repentance."(LUKE 5:31-32) 运算符 在编程语言,运算符是比较多样化的,虽然在《常用