簡體   English   中英

c ++ 11 -Template MetaProgramming-錯誤:模板參數未在部分專業化中使用

[英]c++11 -Template MetaProgramming - Error: template parameters not used in partial specialization

我陷入了部分模板實現的困境,想法是提供一個使用枚舉類定義在編譯時選擇的類(生成器),我也想提供文件名和一個類名,以便從工廠單身人士。 但這沒有編譯,我正在嘗試幾個小時,但是我看不到我在做什么錯。 這是代碼:

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'

在這個時候,我真的很累,我正在尋求幫助。 提前謝謝// ============================================= ========為了簡單起見,我將使用解決方案發布代碼:

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;
}

您的類模板BuiderType具有一個類型為BuildersType的非類型模板參數,以及一包名為Args的類型模板參數,但是您的專業化對象有兩個非類型模板參數FILENAMECLASSNAME (在其中,您可以使用其中的一個非類型來實際地專門化BuiderType )。 在聲明/定義aBuilder的行中,使用了一組與template<BuildersType, class ... Args> class BuiderType;的聲明不兼容的模板參數template<BuildersType, class ... Args> class BuiderType; 因為在這里除了第一個參數外,您沒有任何非類型模板參數。

此代碼段具有相同的行為:

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM