将类转换为模板类

时间:2016-06-20 00:37:30

标签: c++ templates casting operators

我正在做一个关于c ++的小项目。 该项目要求我编写一个模板类,比方说A类。 我对A的要求很少,其中包括:

  1. A实现中不允许动态分配。
  2. A保存类型为T的参数(不是指针,因此不是“new”)。
  3. A可以为空(即未初始化)。
  4. 可以通过以下方式初始化A:

    A<int> a;
    A<int> a(5);
    A<int> a = 5;
    A<int> a = Empty;
    
  5. 我对3种初始类型的初始化没有任何问题,但是我对最后一个选项有点无能为力。

    Empty是我应该定义的一些类,但是我想要。我最初的方向是创建一个(空)类EmptyClass:

    class EmptyClass {};
    

    静态实例化一个名为Empty的对象(因此任何使用过的A类也会知道Empty):

    static EmptyClass Empty;
    

    就是这样。显然,它不起作用。

    整个(相关)模板声明:

    class A{
    private:
        T _Value;
        bool _empty;
    public:
        A();
        A(const T value);
        A(const EmptyClass none);
        A(const A& opt);
        A(const EmptyClass & none);
        //Checks if the object is empty
        const bool isEmpty() const;
        //Destructor
        ~Optional();
        A<T>& operator=(const EmptyClass& rhs);
        A<T>& operator=(const A<T>& rhs);
    };
    

    目前我在这一行收到错误:

    A<int> optionalInt = Empty
    

    错误是:

      

    错误:从'EmptyClass(*)()'无效转换为'int'[-fpermissive]

    我被允许只使用c ++ 98标准。 想为解决这个问题找到方向。

    谢谢!

1 个答案:

答案 0 :(得分:0)

问题1:

您有两个构造函数可以将EmptyClass作为输入。

A(const EmptyClass none);
A(const EmptyClass & none);

两者同样适合该行

A<int> a = Empty;

编译器无法消除要使用的构造函数的歧义。

简单的解决方法是删除其中一个。我建议你删除这两个构造函数中的第一个。

问题2:

这是一条非常奇怪的路线。

~Optional();

那需要:

~A();