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

模板化类好友操作员成员功能

方寒
2023-03-14

我试图在一个模板化的类中获得一个友元函数来编译,但是错误信息和警告我不理解。我已经对这个问题进行了论证。我得到的错误是:

prog.cpp:8:57:错误:非类、非变量部分专门化C运算符(const B

掠夺。cpp:15:59:警告:友元声明'C运算符(常量B

prog.cpp:15:59:注意:(如果这不是您想要的,请确保函数模板已经声明并添加

#include <iostream>
using namespace std;

template<typename A, typename B>
class C;

template<typename A, typename B>
C<A, B> operator+<A, B>(const B& lhs, const C<A, B>& rhs);

template<typename A, typename B>
struct C
{
    A val_;
    C operator+(const C& other) const;
    friend C<A, B> operator+(const B& lhs, const C<A, B>& rhs);
};

template<typename A, typename B>
C<A, B> C<A, B>::operator+(const C<A, B>& other) const
{
    C<A, B> c;
    c.val_ = this->val_ + other.val_;
    return c;
}

template<typename A, typename B>
 C<A, B> operator+(const B& lhs, const C<A, B>& rhs)
{
    C<A, B> c;
    c.val_ = lhs + rhs.val_;
    return c;
}

int main() 
{
    C<string, char> c0,c1;
    c0.val_ = " C0 ";
    c1.val_ = " C1 ";
    cout << "Stuct:" << (c0 + c1).val_ << '\n';
    cout << "Friend:" << ('~' + c1).val_ << endl;
    return 0;
}

共有2个答案

凌朗
2023-03-14

本声明:

template<typename A, typename B>
C<A, B> operator+<A, B>(const B& lhs, const C<A, B>& rhs);

...是错误的,因为<代码>

此声明应为:

template<typename A, typename B>
C<A, B> operator+ (const B& lhs, const C<A, B>& rhs);

然后,您应该在朋友声明中显式指定您想要一个专用版本,方法是编写:

friend C<A,B> operator+<>(const B& lhs, const C<A,B>& rhs);

您需要将其放在<code>运算符</code>之前,否则编译器会认为这是非模板函数的特化。

无论如何,如果你没有真正的理由把你的代码放在C类之外,我会去@Jarod42解决方案。

您的整个代码应该如下所示:

// Declaration of struct C with delayed definition
template <typename A, typename B>
struct C;

// Initial declaration of templated operator+
template <typename A, typename B>
C<A, B> operator+ (const B&, const C<A, B>&);

// Definition of C
template <typename A, typename B>
struct C {

    friend C operator+<> (const B&, const C&);

    // This must be AFTER the templated operator+
    C operator+ (const C&) const;
};

template<typename A, typename B>
C<A, B> C<A, B>::operator+(const C<A, B>& other) const {

}

template<typename A, typename B>
C<A, B> operator+(const B& lhs, const C<A, B>& rhs) {

}
洪飞驰
2023-03-14

最简单的方法是在类中内联代码

template <typename A, typename B>
struct C
{
    A val_;
    C operator+(const C& other) const
    {
        C c;
        c.val_ = this->val_ + other.val_;
        return c;
    }

    friend C operator+ (const B& lhs, const C& rhs)
    {
        C c;
        c.val_ = lhs + rhs.val_;
        return c;
    }
};

演示

类中没有内联的代码,需要注意前置声明顺序,奇怪的语法

template <typename A, typename B> struct C;

template <typename A, typename B>
C<A, B> operator+ (const B& lhs, const C<A, B>& rhs);

template <typename A, typename B>
struct C
{
    A val_;

    friend C<A, B> operator+<> (const B& lhs, const C<A, B>& rhs);

    C operator+(const C& other) const;
};


template <typename A, typename B>
C<A, B> operator+ (const B& lhs, const C<A, B>& rhs)
{
    C<A, B> c;
    c.val_ = lhs + rhs.val_;
    return c;
}

template <typename A, typename B>
C<A, B> C::operator+(const C<A, B>& other) const
{
    C<A, B> c;
    c.val_ = this->val_ + other.val_;
    return c;
}

演示

 类似资料:
  • 我是新使用模板。作为标题,我有一个非模板类(Obj和ObjBase)和一个模板类pitem。我想让pItem::RefValue()访问obj中的私有成员。 我想下面的行得通: 它不: 错误C2248:“obj::GetValue”:无法访问类“obj”中声明的私有成员 注意:请参阅对正在编译的函数模板实例化“int PItem::GetValue(void)”的引用 编译器投诉:

  • 我有一个问题,我想在下面的代码中专门化模板类的模板成员函数。这个问题的答案是模板类成员函数的显式特化,这似乎表明它无法完成。这是正确的吗,如果是这样,我可以使用任何解决方法,以便在编译时通过内联inc函数进行扩展? 非常感谢! g吐槽道: test2.cpp:32:13: 错误: 非命名空间作用域中的显式专用化 'struct IdxIterator' test2.cpp:32:25: 错误: 非

  • 是否有人知道此显式特化是否有效: clang 主干 (12/3/2013) 给出以下错误: f:...\test.cpp:36:20: 错误: 从类 'O' 中出线定义 “Fun” 没有定义 1生成错误。 任何来自标准的支持参考来证明你的答案将不胜感激! 注意:我有点惊讶这是一个错误——我认为应该为任何以< code >开始实例化“Fun”的模板参数族选择专门化 这是一个叮当的错误还是我期望中的错

  • 我有一个模板化的C++类,它也有一个模板化的成员函数。这个成员函数的模板参数以特定的方式依赖于类的模板参数(请参阅下面的代码)。我正在为其模板参数的两个不同值实例化(而不是专门化)该类。一切都在这一点上进行。但是,如果我调用模板化的成员函数,对第一个实例化对象的调用只会编译,而不会编译第二个。似乎编译器没有为模板类的第二次实例化实例化模板化成员函数。我正在使用“g++filename.cpp”编译

  • 我有以下示例类<code>Foo</code>和嵌套类<code<Bar</code<,所有内容都是<code>constexpr</code>: 我想测试调用<code>Foo::DoTheThing</code>返回1: 海湾合作委员会和Clang都在这里抱怨,但MSVC没有 GCC表示: 错误: ,或者如果我将< code>Bar的定义移到< code>Foo之外,我可以让GCC和Clang

  • 这里有一个最小的例子来说明我遇到的问题。 模板成员显式专用于基类中的。模板的代码是显式生成的,并在成员中调用。 我发现的第一个问题是: 该错误是由于在main中调用造成的。可以通过调用来避免这种情况。为什么在的实例中显然是不可见的?