Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ g++;认为我的班级宣言是一个;远期申报;_C++_Templates_Variadic Templates_Crtp - Fatal编程技术网

C++ g++;认为我的班级宣言是一个;远期申报;

C++ g++;认为我的班级宣言是一个;远期申报;,c++,templates,variadic-templates,crtp,C++,Templates,Variadic Templates,Crtp,下面是我试图编译的代码: template<class T> class B { protected: std::vector<typename T::I> v; public: template<class... Args> void add(Args... args ) { this->v.emplace_back(std::forward<Args>(args)...);

下面是我试图编译的代码:

template<class T>
class B
{
  protected:

    std::vector<typename T::I> v;

  public:

    template<class... Args>
    void add(Args... args )
    {
      this->v.emplace_back(std::forward<Args>(args)...);
    }

    typename T::I get(int i)
    {
      return this->v[i];
    }
};

class D : public B<D>
{
  public:

    typedef std::string I;
};
并加注,

注:“D类”的转发声明

std::vector<typename T::I> v;
class D : public B<D>

我肯定我只是在做一些愚蠢的事情,但我似乎不明白。问题是当你写作的时候

class D : public B<D>
并从
C
B
继承
D

D类:公共C、公共B
{ };

这样,当您将
C
用作
B
的模板参数时,它是完全定义的,并且也是从
D
继承的

在点
std::vector
T
不完整。编译器是对的。我隐约记得几年前(也许10年前)我用过这种风格。当时,它对我很有效(在当时的MSVC编译器上)。最近我也尝试过类似的方法,但我遇到了一些问题。我认为这是因为我太生疏了:)MSVC因为让奇怪的东西和模板一起飞而臭名昭著。可能的重复:那你怎么做我想做的事呢?使用不同的语言。你想做的不是有效的C++。@丹尼尔克劳里可能给<代码> B<代码>附加的模板参数,并提供它的别名作为<代码> i>代码>。因此,不要让
D
有一个
std::string
的别名,而是把
std::string
作为模板参数,让
B
提供
I
。@Blindy:这不是很有效:/@FrançoisAndrieux-我的错:我把
B
D
搞混了。
class D : public B<D>
struct C
 { using I = std::string; };
class D : public C, public B<C>
 { };