我有一个包含内部类的模板类。在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所有专业的朋友。但我不知道如何介绍它们。
旁注:请随时更改标题,因为我真的不知道如何标题这个具体问题。
答案 0 :(得分:4)
foo<double>::bar
与const 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
内定义一个相同但独立的内部类是没有意义的。