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