我有一个类的模板(我们称之为A),它应该是其他类(B或C)之一的子类,具体取决于我的自定义特征结构中的条件编译时间。我附加了一个重现行为的片段。
$(document).on('click','.enable',function(){
$(this).attr('disabled',false);
// Possibly do the form submit here...whatever I get to work
});
如果我这样离开(硬编码A作为超类),一切正常。但是,一旦我用注释掉的行替换类定义,我就会收到以下错误消息:
#include <type_traits>
template<typename T>
class cls_template {
public:
using method_arg_type = T;
virtual void method(method_arg_type) = 0;
};
using A = cls_template<float>;
using B = cls_template<int>;
template<typename T>
struct traits {
using cls = std::conditional<std::is_floating_point<T>::value, A, B>;
};
//class C : public traits<float>::cls {
class C : public A {
public:
virtual void method(method_arg_type arg) {};
};
int main() {
A *a = new C();
}
为什么test.cpp:21:27: error: unknown type name 'method_arg_type'
virtual void method(method_arg_type arg) {};
^
test.cpp:25:10: error: cannot initialize a variable of type 'A *'
(aka 'cls_template<float> *') with an rvalue of type 'C *'
A *a = new C();
^ ~~~~~~~
不再定义?为什么method_arg_type
不再被识别为C
的子类?我发现如果A
不是模板(如果我只是将类型硬编码到结构中),那么一切正常。
答案 0 :(得分:4)