2012-08-13 114 views
1

我正在使用libMesh FEM库并试图开发从libMesh继承的类(EqCore)。这个类将提供一些额外的功能,这些功能是由我想实际使用的类(MainEq)再次继承的。C++访问继承类的成员,其中继承的类是模板参数

两个函数set_constant和get_constant正在导致下面的错误。这些工作如不同的继承方案所示(见Inheritance of template class with a template member function in C++)。与这个问题的区别在于现在模板参数(Type)实际上是一个继承的类。这是一种危险的做法吗?

我希望得到这个代码工作或寻找替代方法的任何帮助。

错误信息:

In member function ‘void EqCore::set_constant(std::string, ParamType)’: test_libmesh.cpp:26:57: error: expected primary-expression before ‘>’ token

In member function ‘ParamType EqCore::get_constant(std::string)’: /home/slaughter/Documents/programs/source/test_libmesh.cpp:31:76: error: expected primary-expression before ‘>’ token

方案:

//! \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")); 
} 
+1

Try'Type :: get_equ ation_systems()。parameters.template设置(名称)' – 2012-08-13 20:06:38

+0

谢谢,这没有把戏。 – slaughter98 2012-08-13 20:20:14

回答

6

因为你是一个模板中,编译器不能确定set在分析时是一个模板自动,它的假设set是一个非模板,因此解析失败。

解决方案是明确告知编译器set是一个成员模板,因此。

Type::get_equation_systems().parameters.template set<ParamType>(name) = var

+0

谢谢。我试着把“模板”放到所有的位置,但从来没有想过把它直接放在设置/得到的单词前面。谢谢! – slaughter98 2012-08-13 20:18:39

2

C++模板元编程:概念,工具,从升压和超越,技术由David亚伯拉罕,阿列克谢Gurtovoy(Amazon)它被解释如下:

double const pi = 3.14159265359; 

template <class T> 
int f(T& x) 
{ 
    return x.convert<3>(pi); 
} 

T::convert might be a member function template, in which case the highlighted code passes pi to a specialization of convert<3> . It could also turn out to be a data member, in which case f returns (x.convert < 3) > pi . That isn't a very useful calculation, but the compiler doesn't know it.

The template keyword tells the compiler that a dependent name is a member template:

template <class T> 
int f(T& x) 
{ 
    return x.template convert<3>(pi); 
} 

If we omit template , the compiler assumes that x.convert does not name a template, and the < that follows it is parsed as the less-than operator.