C++ C++;访问继承类的成员,其中继承类是模板参数

C++ C++;访问继承类的成员,其中继承类是模板参数,c++,templates,inheritance,disambiguation,C++,Templates,Inheritance,Disambiguation,我正在使用libMesh有限元库,并试图开发一个从libMesh继承的类(EqCore)。这个类将提供一些额外的特性,这些特性将被我想要实际使用的类(MainEq)再次继承 set_constant和get_constant这两个函数会导致以下错误。如图所示,它们使用不同的继承方案(请参阅)。这个问题的不同之处在于,现在模板参数(类型)实际上是一个继承的类。这是一种危险的做法吗 如果您能帮助我使这段代码正常工作或找到另一种方法,我将不胜感激 错误消息: 在成员函数“void EqCore::se

我正在使用libMesh有限元库,并试图开发一个从libMesh继承的类(EqCore)。这个类将提供一些额外的特性,这些特性将被我想要实际使用的类(MainEq)再次继承

set_constant和get_constant这两个函数会导致以下错误。如图所示,它们使用不同的继承方案(请参阅)。这个问题的不同之处在于,现在模板参数(类型)实际上是一个继承的类。这是一种危险的做法吗

如果您能帮助我使这段代码正常工作或找到另一种方法,我将不胜感激

错误消息:

在成员函数“void EqCore::set_constant(std::string,ParamType)”中: test_libmesh.cpp:26:57:错误:在“>”标记之前应该有主表达式

在成员函数“ParamType EqCore::get_constant(std::string)”中: /home/slauttle/Documents/programs/source/test_libmesh.cpp:31:76:错误:在“>”标记之前应该有主表达式

节目:

//! \example test_libmesh.cpp

#include <string>
using std::string;

// libMesh includes
#include <libmesh.h>
#include <libmesh_common.h> 
#include <equation_systems.h>
#include <transient_system.h>
#include <explicit_system.h>
#include <parameters.h>
#include <mesh.h>
using namespace libMesh;

// Fundamental behavior that will be used among many classes
template <typename Type> class EqCore : Type{
    public:

        // Class constructor
        EqCore(EquationSystems& sys, string name) : Type(sys, name, 1){}

        // A function for storing a constant value (causes error)
        template<typename ParamType> void set_constant(std::string name, ParamType var){  
            Type::get_equation_systems().parameters.set<ParamType>(name) = var;
        }

        // A function for retrieving a constant value (causes error)
        template<typename ParamType> ParamType get_constant(std::string name){  
            ParamType output = Type::get_equation_systems().parameters.get<ParamType>(name);
            return output;
        } 
};

// A test class derived
class MainEq : public EqCore<ExplicitSystem>{
    public: 

        // Constructor
        MainEq(EquationSystems& sys) : EqCore(sys, "main"){ }   

};  


// Begin main function
int main (int argc, char** argv){

    // Initialize libMesh and create an empty mesh
    LibMeshInit init (argc, argv);
    Mesh mesh;

    // Test w/o any of the above classes
    EquationSystems eq_sys(mesh);
    eq_sys.parameters.set<double>("test1") = 1;
    printf("Test 1: %f\n", eq_sys.parameters.get<double>("test1"));

    // Test my class set/get functions
    MainEq eq(eq_sys);
    eq.set_constant<double>("test2", 2);
    printf("Test 2: %f\n", eq.get_constant<double>("test2"));   
}
/\示例测试_libmesh.cpp
#包括
使用std::string;
//libMesh包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间libMesh;
//将在许多类中使用的基本行为
模板类EqCore:类型{
公众:
//类构造函数
EqCore(equalationsystems&sys,字符串名):类型(sys,name,1){}
//用于存储常量值的函数(导致错误)
模板void set_常量(std::string name,ParamType var){
类型::获取方程系统().parameters.set(name)=var;
}
//用于检索常量值的函数(导致错误)
模板参数类型get_常量(std::string name){
ParamType output=Type::get_等式_systems().parameters.get(name);
返回输出;
} 
};
//派生的测试类
类别MainEq:公共EqCore{
公众:
//建造师
MainEq(equalationsystems&sys):EqCore(sys,“main”){}
};  
//开始主要功能
int main(int argc,字符**argv){
//初始化libMesh并创建一个空网格
LibMeshInit(argc,argv);
网目;
//不带任何上述类别的测试
等式系统等式系统(网格);
等式系统参数集(“test1”)=1;
printf(“测试1:%f\n”,等式系统参数.get(“测试1”);
//测试我的类set/get函数
主均衡器(均衡器系统);
等式:设置_常数(“测试2”,2);
printf(“测试2:%f\n”,等式get_常量(“测试2”);
}

因为您在模板中,编译器无法在解析期间自动确定
set
是模板,并且它假设
set
是非模板,因此解析失败

解决方案是显式地通知编译器,
set
本身就是一个成员模板


Type::get\u equation\u systems().parameters.template set(name)=var

因为您在模板中,编译器无法在解析期间自动确定
set
是模板,并且它假设
set
是非模板,因此解析失败

解决方案是显式地通知编译器,
set
本身就是一个成员模板

< C++ >模板元编程:David Abrahams、Aleksey Gurtovoy()的概念、工具和技术,由以下内容解释:

double const pi = 3.14159265359;

template <class T>
int f(T& x)
{
    return x.convert<3>(pi);
}
如果省略
模板
,编译器将假定
x.convert
不会 命名一个模板,随后的<将被解析为小于 接线员

< C++模板元编程:从Boost和Exter中的概念、工具和技术,由David Abrahams、Aleksey Gurtovoy()解释如下:

double const pi = 3.14159265359;

template <class T>
int f(T& x)
{
    return x.convert<3>(pi);
}
如果省略
模板
,编译器将假定
x.convert
不会 命名一个模板,随后的<将被解析为小于 接线员


请尝试
Type::get\u equation\u systems().parameters.template set(名称)
Try
Type::get\u equation\u systems().parameters.template set(名称)
谢谢。我试着把“模板”放得到处都是,但从没想过把它直接放在set/get单词前面。谢谢谢谢我试着把“模板”放得到处都是,但从没想过把它直接放在set/get单词前面。谢谢