模板类复制内部类问题中的模板分配运算符

Template assignment operator in template class copying inner class issue

本文关键字:运算符 分配 内部类 复制 问题      更新时间:2023-10-16

我有一个包含内部类的模板类。在运算符=()重载上,我想复制内部类的一个实例,但得到一个错误:

no known conversion from 'const foo<double>::bar' to 'const foo<int>::bar'

代码看起来像(你可以在这里找到一个例子):

template<typename T>
class foo {
public:
    template<typename>
    friend class foo;
    class bar {
        std::string inner_str;
    public:
        bar const& operator=(bar const& r) {
            inner_str = r.inner_str;
            return *this;
        }
    };
    template<typename F>
    foo const& operator=(foo<F> const& r) {
        value = static_cast<T>(r.value);
        str_container = r.str_container;
        return *this;
    }
private:
    bar str_container;
    T value;
};

bar移到foo之外可以很好地工作,但是内部类应该是foo的一部分。

如何解决此问题我想过让bar成为朋友,就像foo是foo所有专业的朋友一样。但我不知道如何介绍他们。

旁注:请随意更改标题,因为我真的不知道如何命名这个特定的问题

foo<double>::bar是与const foo<int>::bar完全无关的类型,因此不能在它们之间隐式转换。

由于bar似乎不依赖于模板参数,因此这似乎是一个明智的解决方案:

在foo外移动酒吧效果良好

问题已解决:)

但是内部类应该是CCD_ 8的一部分。

考虑到你如何使用它,我认为不,它不应该是foo的一部分。

或者,您可以将bar的赋值运算符作为模板,就像使用foo:的赋值运算符一样

template<typename B>
bar const& operator=(const B& r) {
    inner_str = r.inner_str;
    return *this;
}
template<typename U>
friend class foo<U>::bar; // this bar must be friends with other bars

如果bar的定义确实依赖于foo的模板参数,那么您可以使用这种方法。否则,在每个foo中定义一个相同但独立的内部类是没有多大意义的。