条件语句中的C ++模板类初始化

时间:2013-11-12 04:14:23

标签: c++ class templates

我试图允许用户选择模板是int,double还是字符串。但是使用我的方法存在继承问题,因为我使用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()时,我都会收到一条错误,说“v1在此范围内未被删除”。如何通过此操作并允许用户选择AND允许方法调用?我知道如果我没有使用模板,我可以在if语句之前声明它,但是对于编译器要求的模板,我告诉它我想要的类型。 谢谢!

1 个答案:

答案 0 :(得分: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;
  };
}
  • 使用动态多态。使用虚拟接口实现基类型,在不同分支内实例化其中一个模板(从接口类型继承)并相应地设置指针。