【问题标题】:Compile time Restricted Templates without use of boost不使用 boost 的编译时间受限模板
【发布时间】:2015-07-31 07:51:43
【问题描述】:

这与这两个问题有关:

  1. standard c++11 way to remove all pointers of a type
  2. Compile Time Template restriction C++

第二个是我的

问题是当我迁移到 TDM-GCC 64 时,以下代码(以前可以工作)无法编译我确保启用了 c++11。

我从第一个问题中提取了 remove_all_pointers,并将其与我的问题的答案(项目符号 #2)结合起来。

以下是我(以前)可编译的示例

#include <iostream>
#include <type_traits>

using namespace std;

template <typename T> class remove_all_pointers{
public:
    typedef T type;
};

template <typename T> class remove_all_pointers<T*>{
public:
    typedef typename remove_all_pointers<T>::type type;
};

template <typename T> class remove_all_pointers<T* const>{
public:
    typedef typename remove_all_pointers<T>::type type;
};

template <typename T> class remove_all_pointers<T* volatile>{
public:
    typedef typename remove_all_pointers<T>::type type;
};

template <typename T> class remove_all_pointers<T* const volatile >{
public:
    typedef typename remove_all_pointers<T>::type type;
};


class OverVoid{
public:

    static bool isOverVoid (){
    return true;
    }
    virtual ~OverVoid(){
    }
};

class Meta: public OverVoid{

};

class Physical{
public:

};

template<typename _Ty,typename = typename std::enable_if<std::is_base_of<OverVoid, remove_all_pointers<_Ty>::type>::value>::type>

class Move{
public:
    Move()
    {
        cout<<"### "<<remove_all_pointers<_Ty>::type::isOverVoid()<<endl;
    }
};


template<typename _Ty,typename = typename std::enable_if<std::is_base_of<OverVoid, remove_all_pointers<_Ty>::type>::value>::type>

class Move{
public:
    Move()
    {
        cout<<"### "<<remove_all_pointers<_Ty>::type::isOverVoid()<<endl;
    }
};




    template<typename _Ty,
    typename enable_if< is_base_of<OverVoid, remove_all_pointers<_Ty>::type>::value>::type>
    class Move{
    public:
        Move()
        {
            cout<<"### "<<remove_all_pointers<_Ty>::type::isOverVoid()<<endl;
        }
    };


    int main(){

        Move<Meta***> z;
        Move<Meta**> w;
        Move<Meta*> x;
        Move<Meta> y;

    }

显示如下错误

Info: Internal Builder is used for build
g++ -std=c++0x -std=c++11 -std=gnu++11 -O0 -g3 -Wall -c -fmessage-length=0 -o "src\\helllo_world.o" "..\\src\\helllo_world.cpp" 
In file included from ..\src\helllo_world.cpp:1:0:
..\src\Move.h:54:111: error: type/value mismatch at argument 2 in template parameter list for 'template<class, class> struct std::is_base_of'
 template<typename _Ty,class = typename std::enable_if<std::is_base_of<OverVoid, remove_all_pointers<_Ty>::type>::value>::type>
                                                                                                               ^
..\src\Move.h:54:111: note:   expected a type, got 'remove_all_pointers<T>::type'
..\src\Move.h:54:119: error: template argument 1 is invalid
 template<typename _Ty,class = typename std::enable_if<std::is_base_of<OverVoid, remove_all_pointers<_Ty>::type>::value>::type>
                                                                                                                       ^
..\src\helllo_world.cpp: In function 'int main()':
..\src\helllo_world.cpp:31:14: error: template argument 2 is invalid
  Move<Meta***> z;
              ^
..\src\helllo_world.cpp:32:13: error: template argument 2 is invalid
  Move<Meta**> w;
             ^
..\src\helllo_world.cpp:33:12: error: template argument 2 is invalid
  Move<Meta*> x;
            ^
..\src\helllo_world.cpp:34:11: error: template argument 2 is invalid
  Move<Meta> y;
           ^
..\src\helllo_world.cpp:31:16: warning: unused variable 'z' [-Wunused-variable]
  Move<Meta***> z;
                ^
..\src\helllo_world.cpp:32:15: warning: unused variable 'w' [-Wunused-variable]
  Move<Meta**> w;
               ^
..\src\helllo_world.cpp:33:14: warning: unused variable 'x' [-Wunused-variable]
  Move<Meta*> x;
              ^
..\src\helllo_world.cpp:34:13: warning: unused variable 'y' [-Wunused-variable]
  Move<Meta> y;
             ^

【问题讨论】:

  • 请提供一个完整的最小可编译示例,说明您想要做什么,并准确解释此处不起作用的地方。就目前而言,您只链接到随机问题而没有任何解释。我也怀疑这与 TDM-MinGW 有什么关系,而是 GCC 更精通标准。
  • 您甚至没有向我们展示实际代码。在实际代码中,typename enable_if…前面有一个class=
  • 编译器错误不是崩溃
  • 添加了请求的编辑
  • “以前编译”是什么意思?什么编译器?发生了什么变化?

标签: c++ templates c++11 typetraits tdm-mingw


【解决方案1】:

您是missing some typenames,并且将类模板Move 定义重复了3 次。

以下代码有效:

#include <iostream>
#include <type_traits>

using namespace std;

template <typename T> class remove_all_pointers{
public:
    typedef T type;
};

template <typename T> class remove_all_pointers<T*>{
public:
    typedef typename remove_all_pointers<T>::type type;
};

template <typename T> class remove_all_pointers<T* const>{
public:
    typedef typename remove_all_pointers<T>::type type;
};

template <typename T> class remove_all_pointers<T* volatile>{
public:
    typedef typename remove_all_pointers<T>::type type;
};

template <typename T> class remove_all_pointers<T* const volatile >{
public:
    typedef typename remove_all_pointers<T>::type type;
};


class OverVoid{
public:

    static bool isOverVoid (){
    return true;
    }
    virtual ~OverVoid(){
    }
};

class Meta: public OverVoid{

};

class Physical{
public:

};

template<typename T, typename = typename std::enable_if<std::is_base_of<OverVoid, typename remove_all_pointers<T>::type>::value>::type>
class Move{
public:
    Move()
    {
        cout<<"### "<<remove_all_pointers<T>::type::isOverVoid()<<endl;
    }
};

/*
template<typename T,typename = typename std::enable_if<std::is_base_of<OverVoid, typename remove_all_pointers<T>::type>::value>::type>
class Move{
public:
    Move()
    {
        cout<<"### "<<remove_all_pointers<T>::type::isOverVoid()<<endl;
    }
};

template<typename T, typename = typename std::enable_if<std::is_base_of<OverVoid, typename remove_all_pointers<T>::type>::value>::type>
class Move{
public:
    Move()
    {
        cout<<"### "<<remove_all_pointers<T>::type::isOverVoid()<<endl;
    }
};
*/

int main(){
    Move<Meta***> z;
    Move<Meta**> w;
    Move<Meta*> x;
    Move<Meta> y;
}

Live demo here.

【讨论】:

    猜你喜欢
    • 2015-07-27
    • 2022-01-19
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2014-06-06
    • 2011-01-16
    相关资源
    最近更新 更多