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>(使多态性可以使用)?
类模板参数推导适用于声明类类型的实例:
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)
| 归档时间: |
|
| 查看次数: |
1463 次 |
| 最近记录: |