gpt4 book ai didi

c++ - 在带有类型保护的模板文件中使用前向声明

转载 作者:行者123 更新时间:2023-11-28 04:33:38 24 4
gpt4 key购买 nike

我正在尝试将模板库中的前向声明与类型保护结合起来,以拦截错误类型的模板与错误类型的类一起使用的情况。这是我能找到的最简单的代码片段,以说明问题...

main.cpp

#include <iostream>
#include "templates.h"

int main()
{
B<int_array> hello;
return 0;
}

模板.h

#include <type_traits>

#define USE_GUARD
#define FORWARD_DECLARE

template<typename T>
using is_pod = typename std::enable_if<std::is_pod<T>::value>::type;

typedef struct {
int *p;
int n;
} int_array;

template <typename E, typename T >
class A
{

};

#ifdef USE_GUARD
template <typename T, typename = is_pod<typename std::remove_pointer<decltype(T::p)>::type> >
#else
template <typename T>
#endif
class B : public T, public A< B<T>, T >
{ // This is the 'curiously recurring template
// pattern' (CRTP)
public:
//! Default constructor
B() noexcept
{
T::p = nullptr;
T::n = 0;
}

#ifdef FORWARD_DECLARE
void reorder(const int_array & newOrder);
#endif
};

template <typename T> class C : public B<T>
{
public:
C() noexcept : B<T>()
{
T::p = nullptr;
T::n = 0;
}
};

#ifdef FORWARD_DECLARE
#ifdef USE_GUARD
template <typename T, typename = is_pod<typename std::remove_pointer<decltype(T::p)>::type> >
#else
template <typename T>
#endif
void B<T>::reorder(const int_array & newOrder)
{
C<T> myC;
}
#endif

我收到如下错误信息:

Visual Studio 2015:

既未定义 USE_GUARD 也未定义 FORWARD_DECLARE - 工作正常

只定义了 FORWARD_DECLARE - 工作正常

只定义了 USE_GUARD - 工作正常

均已定义 - C3860: template argument lost following class template name must list parameters in the order used in template parameter list

g++:

既未定义 USE_GUARD 也未定义 FORWARD_DECLARE - 工作正常

只定义了 FORWARD_DECLARE - 工作正常

只定义了 USE_GUARD - 工作正常

均已定义 - Invalid use of incomplete type 'class B<T>在定义函数 'reorder' 的地方

所以很明显我在将类型保护与前向声明结合起来的方式上做错了,但两个编译器都没有给我一个非常容易理解的错误消息。我是在语法上犯了一个基本错误,还是只是想做一些根本上很愚蠢的事情?

最佳答案

默认参数不应在成员定义中重复,并且应提供所有参数:

#ifdef FORWARD_DECLARE
# ifdef USE_GUARD
template <typename T, typename U>
void B<T, U>::reorder(const int_array & newOrder)
# else
template <typename T>
void B<T>::reorder(const int_array & newOrder)
# endif
{
C<T> myC;
}
#endif

Demo

关于c++ - 在带有类型保护的模板文件中使用前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52174134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com