【发布时间】:2018-01-12 01:40:06
【问题描述】:
我成功地为名为 Global 的全局范围内的模板类构建了一个重载运算符+(Global left, int right)。
template <typename T>
class Global {
public:
Global operator+(const int& right) const
{
cout << "Using Global overloaded operator+" << endl;
return *this;
}
};
由于加法是可交换的,我还创建了另一个重载运算符+(int left, Global right) 来允许可交换操作。
template <typename T>
Global<T> operator +(int left, Global<T> right)
{
return right + left;
}
这是我尝试为嵌套类做同样的事情。
template <typename T>
class Container {
public:
class Nested {
public:
Nested operator+(const int& right) const
{
cout << "Using Nested overloaded operator+" << endl;
return *this;
}
};
};
template <typename T> // The following line is critical
typename Container<T>::Nested operator+(int left, typename Container<T>::Nested right)
{// Both 'typename' are necessary to avoid extra compilation errors
return right + left;
}
现在,当我尝试执行以下代码来测试运算符重载时,在尝试使用嵌套类中的可交换运算符 + 时遇到一些编译错误,主要是 "Error C2783 - 'Container::Nested operator + (int,Container::Nested)': 无法推导出 'T' 的模板参数”,还有“错误 E0349 - 没有运算符“+”匹配这些操作数”。 p>
int main(void)
{
Global<int> global;
global + 2; // Works perfectly
2 + global; // Works perfectly
Container<int>::Nested nested;
nested + 2; // Works perfectly
2 + nested; // Compilation Error C2783 and E0349
system("pause"); // Everything works fine without the line above
return 0;
}
我正在使用启用了 /std:c++latest 的 Visual Studio 15.5.2。如果可能,我希望在嵌套类定义中定义 operator+。
【问题讨论】:
-
Global<T> operator +(int left, typename Global<T> right)应该是Global<T> operator +(int left, Global<T> right)。那里不需要typename -
全局运算符+ 完全没问题。如果您指的是嵌套运算符+,我尝试将类型名删除为“Container
::Nested operator+(int count, Container ::Nested iterator)”。编译器会抛出很多与 operator+ 无关的额外错误,例如 Error C2065 'global': undeclared identifier。如果我只删除一个“类型名”,也会发生同样的情况。 -
在
Global<T> operator +中使用typename,我的编译器给出了不必要的typename错误... -
如果我理解正确的话,我尝试将这一行
typename Container<T>::Nested operator+(int left, typename Container<T>::Nested right)切换成这行Container<T>::Nested operator+(int left, typename Container<T>::Nested right) -
那你误会了。我复制粘贴了您发布的确切代码。我的意思是删除 second 代码块中提供的函数中的
typename,即:Global<T> operator +(int left, typename Global<T> right)。typename这里是错误的。
标签: c++ templates nested operator-overloading