0

我试图让用户选择模板是 int、double 还是 string。但是我的方法存在继承问题,因为我使用 If 语句来初始化类模板对象,所以每当我想进行方法调用时,编译器都会抛出错误。

template<class T>
class foo {
    private:
        int bar
    public:
        void setBar(int newBar);

};
template<class T>
void foo<T>::setBar(int newBar) {
    bar = newBar;
}
int main() {
    int inputType;
    cout << endl << "1 for integer, 2 for double, 3 for strings." << endl <<
            "What kind of data do you wish to enter?(1-3): ";
    cin >> inputType;
    if(inputType == 1) {
        foo<int> v1;
    } else if(inputType == 2) {
        foo<double> v1;
    } else if(inputType == 3) {
        foo<string> v1;
    } else {
        cout << "Error - Please enter in a proper #: ";
    }
    //Compiler Error
    v1.setBar(3);
    return 0;
}

因为我是这样做的,所以每当我尝试调用setBar(). 我如何克服这一点并允许用户选择并允许方法调用?我知道如果我不使用模板,我可以在 if 语句之前声明它,但是对于模板,编译器要求我先告诉它我想要什么类型。谢谢!

4

1 回答 1

2

这在您尝试时无法完成。第一个问题是不同的变量v1是在不包括以后使用的范围内定义的。可以采取不同的解决方法,其中最先想到的两个是:

  • 重新排序代码,以便 main 末尾的代码在模板函数中实现,根据代码路径使用不同的参数调用该函数

例子

template <typename T>
void process() {
   foo<T> v1;
   v1.setBar(3);
}
int main() {
  // …
  switch (input) {
  case 1: process<int>(); break;
  case 2: process<double>(); break;
  default: process<string>(); break;
  };
}
  • 使用动态多态性。用虚拟接口实现一个基类型,在不同的分支中实例化一个模板(从接口类型继承)并相应地设置一个指针。
于 2013-11-12T04:21:35.070 回答