模板 class 中的模板赋值运算符复制内部 class 问题

Template assignment operator in template class copying inner class issue

我有一个包含内部 class 的模板 class。在 operator=() 重载上,我想复制内部 class 的一个实例,但出现错误:

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

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

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 之外可以正常工作,但内部 class 应该是 foo.

的一部分

如何解决这个问题? 我想过让 bar 像 foo 这样的朋友是 foo 的所有特化的朋友。但是不知道怎么介绍。

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

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

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

Moving bar outside foo works fine

问题已解决:)

but the inner class should be part of foo.

考虑到你如何使用它,我认为不,它不应该是 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.

中定义一个相同但分开的内部 class 没有多大意义