模板 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 没有多大意义
我有一个包含内部 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
.