代码之家  ›  专栏  ›  技术社区  ›  Georg

C++17中类模板的模板参数推导:我做错了吗?

  •  7
  • Georg  · 技术社区  · 7 年前

    https://gcc.gnu.org/projects/cxx-status.html ,g++版本7,与标志一起使用 -std=c++1z

    我希望编译以下代码,尤其是作为 Base 是一个抽象类,因此:
    编译器不知道 可以创建;
    2、指向基的指针 pt_base Derived<int>{42} )其中类型( int

    template<typename ValueType>
    class Base {
    public:
        virtual ValueType getValue() = 0;
    };
    
    template<typename ValueType>
    class Derived : public Base<ValueType>{
    public:
        Derived(ValueType argt){ value = argt; }
        virtual ValueType getValue(){ return value; }
        ValueType value;
    };
    
    int main(){
        Base *pt_base = new(Derived<int>{42}); // *ERROR*
        delete pt_base;
    }
    

    然而,它 does not compile 模板占位符类型“Base”后面必须跟一个简单的声明器id
    很遗憾,因为我想动态地决定哪个派生类 Derived<someType> 或来自课堂 Derived2<someType2> vector<Base *> 可以存储指向各种派生类的对象的指针。

    GCC只有 experimental support 对于C++17,我没有访问另一个编译器的权限,所以尽管我得到了一个编译错误,但我不确定我的代码是错的。你怎么认为?
    我们怎么能动态地决定呢 衍生2<某些类型2>

    1 回复  |  直到 7 年前
        1
  •  10
  •   Barry    7 年前

    Derived d(42);
    

    或新表达式:

    auto p = new Derived(42);
    

    foo(Derived(42));
    


    您只需像往常一样提供模板参数。或者,我想:

    template <class T> Base<T>* downcast(Base<T>* p) { return p; }
    auto pt_base = downcast(new Derived(42));