【发布时间】:2015-09-26 21:44:15
【问题描述】:
我使用模板类类型数据类型作为类方法的参数。在那种方法中,我正在计算参数的差异并打印它。这只是实际项目中的示例代码。
Header.h
#ifndef Header_h
#define Header_h
#include <iostream>
#include "string.h"
template <class T>
class Student
{
public:
Student(T);
void calcDifference(int idx, T val1, T val2);
};
#endif
main.cpp
#include <iostream>
#include "Header.h"
using namespace std;
template <class T>
void Student<T>::calcDifference(int idx, T val1, T val2)
{
T difference = val1 - val2;
cout<<"\nDifference values: "<<difference<<endl;
}
template <class T>
Student<T>::Student(T)
{
cout<<"constructor called";
}
int main(int argc, const char * argv[])
{
Student<int> oStudent(10);
oStudent.calcDifference(1, 12, 10);
//THIS FOLLOWING OBJECT CREATES ERROR BECAUSE IT IS TRYING TO PASS STRING TYPE
Student<string> o2_Student("hi");
o2_Student.calcDifference(1, "aaa", "aa");
return 0;
}
问题: 因为,我正在尝试计算calcDifference() 中的参数之间的差异,main() 中的第二个对象试图传递字符串会产生问题。这是因为无法对字符串进行差分运算(至少直接)。
错误: /Users/siddharth/coding/cplusplus/xCode/CPPCodes/InterviewTest/InterviewTest/main.cpp:9:26: Invalid operands to binary expression ('std::__1::basic_string<char>' and 'std::__1::basic_string<char>')
我需要什么:我希望代码保持通用(对于我无法实际更改的调用函数)。我想找到一些解决方案,这样我就不会得到这个编译器错误,如果传递的参数是字符串类型,那么calcDifference() 应该打印一个语句(如“不允许使用字符串数据类型”)并返回调用函数。我可以在calcDifference() ONLY 中进行更改,因为在实际项目中我无法控制调用函数。我认为在这种情况下异常处理无济于事,因为它有助于捕获运行时错误,但在这种情况下,由于调用函数试图传递字符串(模板 T 被设为字符串),所以我得到了编译时错误。
PS:我无法对这个结构进行任何更改,这意味着我什至无法更改参数的数量等。我只能在方法 calcDifference() 中进行更改。
【问题讨论】:
-
你能在
calcDifference中添加一个额外的参数,告诉它如何处理这两个对象吗?它可以默认为std::less,但允许您提供自己的功能。 -
不,我不能对这个结构做任何改变。我只能在方法内部进行更改。
-
您希望如何“处理此案”?你期望发生什么? (你不想要编译时错误,对吧?)
-
在
calcDifference内部,您可以调用一个免费的辅助函数来计算差异并适当地重载它。 -
可能是,我没有找到合适的标题。我的意思是,当调用函数试图传递字符串时,我该如何处理。
标签: c++ template-classes