問題:我收到下面的錯誤代碼,有誰知道爲什麼?C++中模板成員函數模板類的繼承問題
問題: 我在一個類(ClassB的)控制的若干類從外部庫(libMesh)行爲的工作。 「...做某事...代碼的一部分被設計爲設置一些變量在這些外部庫類有模板功能
我想能夠設置一些這些值從構造函數繼承類(ClassC),但是,如果我這樣做,如下面的代碼所示,如果我在構造函數中刪除了這個命令,它就可以正常工作了。使用它會產生相同的錯誤,但使用類本身,它說明了我想要做的更好一點。我不確定我想要做什麼的用處,我主要想知道爲什麼不這樣做工作,因爲它看起來應該。
我發現了另一個類似的帖子,但我似乎無法將它們應用於我的問題。
Template inheritance inner class access problem
感謝您的幫助, 安德魯
錯誤:
[email protected]:~/Documents/programs/build$ make test
[100%] Building CXX object CMakeFiles/test.dir/source/test.cpp.o
test.cpp: In constructor ‘ClassC<T>::ClassC()’:
test.cpp:16:29: error: expected primary-expression before ‘int’
test.cpp:16:29: error: expected ‘;’ before ‘int’
make[3]: *** [CMakeFiles/test.dir/source/test.cpp.o] Error 1
make[2]: *** [CMakeFiles/test.dir/all] Error 2
make[1]: *** [CMakeFiles/test.dir/rule] Error 2
make: *** [test] Error 2
簡單的代碼:
// A class that sets that sets the value of something
template <typename Type> class ClassB{
public:
ClassB(){}
template<typename TypeValue> void set_value(TypeValue value){
// ... do something ...
}
};
// A class that inherits ClassB
template<typename T> class ClassC : public ClassB<T>{
public:
ClassC(){
// I want to do this (if I remove this it compiles)
ClassB<T>::set_value<int>(1);;
}
};
// The main function
int main(){
ClassC<double> c;
c.set_value<int>(1); // This works
}
問題的具體代碼:
//! \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{
public:
// Class constructor
EqCore(EquationSystems& sys, string name) : eq_sys(sys){
// Creates a system that will store the constant(s)
name_.assign(name);
eq_sys.add_system<Type>(name_);
// I can set stuff from here
set_constant<double>("test4", 4);
}
// A function for storing a constant value
template<typename ParamType> void set_constant(std::string name, ParamType var){
eq_sys.parameters.set<ParamType>(name) = var;
}
// A function for retrieving a constant value
template<typename ParamType> ParamType get_constant(std::string name){
ParamType output = eq_sys.parameters.get<ParamType>(name);
return output;
}
// Reference to the controlling equation system
EquationSystems& eq_sys;
// The name of the system holding the constant(s)
string name_;
};
// A test class derived
template <typename Type> class EqBase : public EqCore<Type>{
public:
// Constructor
EqBase(EquationSystems& sys, string name) : EqCore<Type>(sys, name){
// I want to do this!
// (remove this and the associated print statement in the main and it works)
EqCore<Type>::set_constant<double>("test5", 5);
}
};
// 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 EqBase/EqCore functions set/get functions
EqBase<TransientExplicitSystem> eq(eq_sys, "TestSystem");
eq.set_constant<double>("test2", 2);
printf("Test 2: %f\n", eq.get_constant<double>("test2"));
// Test generic creation but accessed through EqBase
eq.eq_sys.parameters.set<double>("test3") = 3;
printf("Test 3: %f\n", eq.eq_sys.parameters.get<double>("test3"));
// Test the constant created in EqCore constructor from EqBase
printf("Test 4: %f\n", eq.eq_sys.parameters.get<double>("test4"));
// Test the constant created in EqBase constructor from EqBase
printf("Test 5: %f\n", eq.eq_sys.parameters.get<double>("test5"));
}
謝謝,就這麼簡單。 – slaughter98