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

Geo*_*org 4 c++ templates g++ c++17

根据 https://gcc.gnu.org/projects/cxx-status.html,g ++版本7与flag一起使用-std=c++1z,支持类模板的模板参数推导.

我希望编译以下代码,特别是作为Base一个抽象类,因此:
1.编译器知道没有Base可以创建的实例;
2.指向base的指针指向pt_base一个明确定义的实例(即Derived<int>{42}),其中type(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;
}
Run Code Online (Sandbox Code Playgroud)

然而,它没有编译.G ++抱怨" 模板占位符类型'Base'必须后跟一个简单的declarator-id "; 如果我理解正确,它不会推断出模板参数.
遗憾是因为我想动态决定哪个派生类pt_base指向(可能是来自类Derived<someType>或类的对象Derived2<someType2>).这样,一个数组或一个vector<Base *>可以存储指向各种派生类的对象的指针.

GCC只有C++ 17的实验支持,我无法访问另一个编译器,所以虽然我收到编译错误,但我不确定我的代码是错误的.你怎么看?
而我们怎么能动态地决定pt_base点从任何物体Derived<someType>Derived2<someType2>(使多态性可以使用)?

Bar*_*rry 9

类模板参数推导适用于声明类类型的实例:

Derived d(42);
Run Code Online (Sandbox Code Playgroud)

或者新表达式:

auto p = new Derived(42);
Run Code Online (Sandbox Code Playgroud)

或函数式转换:

foo(Derived(42));
Run Code Online (Sandbox Code Playgroud)

它不适用于声明指针.


您必须像往常一样提供模板参数.或者,我想:

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