2016-02-26 69 views
0

我陷入了部分模板实现中,想法是提供一个在编译时使用枚举选择的类(生成器)类的定义,我也想提供文件的名称和一个班级名称从工厂单身管理。但这不是编译,我正在尝试几个小时,但我看不出我做错了什么。 这是代码:C++ 11 -Template MetaProgramming - 错误:部分专业化中未使用的模板参数

enum class BuildersType 
{ 
    ComunicationBuilder 
}; 

//class definition 
template<BuildersType, class ... Args> 
class BuiderType; 

//class implementation 
template<const char * const FILENAME , const char * const CLASSNAME, class ClassToConfigurate> 
class BuiderType<BuildersType::ComunicationBuilder,const char * const ,const char * const ,ClassToConfigurate> 
{ 
    public: 

}; 

template<const char * const FILENAME , const char * const CLASSNAME> 
class AnotherBuilder 
{ 
}; 

namespace Test 
{ 
    static constexpr char FILENAME []="aFileName"; 
    static constexpr char CLASSNAME []="ClassName"; 
    class TestClass{}; 
} 

int main() 
{ 

    BuiderType<BuildersType::ComunicationBuilder,Test::FILENAME,Test::CLASSNAME,Test::TestClass> aBuilder; 
    AnotherBuilder<Test::FILENAME,Test::CLASSNAME> aAnotherBuilder; 
    return 0; 
} 

的编译输出中:

Error: template parameters not used in partial specialization: 
class BuiderType<BuildersType::ComunicationBuilder,const char * const ,const char * const ,ClassToConfigurate> 
    ^
main.cpp:14:7: error:   'FILENAME' 
main.cpp:14:7: error:   'CLASSNAME' 

在这个时间我真的累了,我要求帮助。 Thx // =========================================== ========== 为了简单起见,我将发布的代码与解决方案:

enum class BuildersType 
{ 
    ComunicationBuilder 
}; 

//class definition 
//Add here definition here of the templates non type arguments 
template<BuildersType, const char * const FILENAME , const char * const CLASSNAME,class ... Args> 
class BuiderType; 

//class implementation 

template<const char * const FILENAME , const char * const CLASSNAME, class ClassToConfigurate, class ... Args> 
class BuiderType<BuildersType::ComunicationBuilder,FILENAME , CLASSNAME ,ClassToConfigurate,Args...> 
{ 
public: 

}; 
template<const char * const FILENAME , const char * const CLASSNAME> 
class AnotherBuilder 
{ 

}; 
namespace Test 
{ 
static constexpr char FILENAME []="aFileName"; 
static constexpr char CLASSNAME []="ClassName"; 
    class TestClass{}; 
} 
int main() 
{ 

    BuiderType<BuildersType::ComunicationBuilder,Test::FILENAME,Test::CLASSNAME,Test::TestClass> aBuilder; 
    AnotherBuilder<Test::FILENAME,Test::CLASSNAME> aAnotherBuilder; 
return 0; 
} 

回答

2

你的类模板BuiderTypeBuildersType类型的非类型模板参数和命名的类型模板参数包Args但您的专业化有两个非类型模板参数FILENAMECLASSNAME(其中您使用它们中的非非实际专用BuiderType)。在声明/定义aBuilder的行中,您使用了一组与第一个模板参数不兼容的模板参数,因为这里除第一个外没有任何非模板参数。

这个片段具有相同的行为:

template<class ... Args> class A; 

// this specialization has a template parameter that 
// 1. cannot and 
// 2. will not be used in the parameter list for A 
template<int I> class A<int> { }; 

int main() 
{ 

    A<int> a; // error: A is an incomplete type 
    A<2> b; // error: '2' is not a type but 
      // A template expects type parameters 

    return 0; 
} 
+0

THX,我dindt注意这个! thx –

+0

@roalz:哈哈......每一个,谢谢:D – Pixelchemist

+0

@Pixelchemist呃呃,对不起,这是我的痴迷:-P – roalz