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

时间:2016-05-09 10:59:53

标签: c++ templates inner-classes assignment-operator

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

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之外可以正常工作,但内部类应该是foo的一部分。

如何解决这个问题?我想让bar朋友像foo一样是foo所有专业的朋友。但我不知道如何介绍它们。

旁注:请随时更改标题,因为我真的不知道如何标题这个具体问题。

1 个答案:

答案 0 :(得分:4)

foo<double>::barconst foo<int>::bar完全不相关,因此您无法隐式转换它们。

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

  

foo外面的移动栏工作正常

问题解决了:))

  

但内部类应该是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内定义一个相同但独立的内部类是没有意义的。