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++ C++;没有合适的默认构造函数可用-继承的模板构造函数,没有参数_C++_Templates_Inheritance - Fatal编程技术网

C++ C++;没有合适的默认构造函数可用-继承的模板构造函数,没有参数

C++ C++;没有合适的默认构造函数可用-继承的模板构造函数,没有参数,c++,templates,inheritance,C++,Templates,Inheritance,我已经研究了十几个qst,其中有短语没有合适的默认构造函数可用,但没有任何帮助解决我自己的问题 这是一个非常基础的C++ QST(因为我还在学习绳子),所以如果你的眼睛在简单化时就很抱歉。我试图继承一个类,它有一个没有参数的模板构造函数。例如: class Base { public: template<class T> Base() { T *t = this; //more irrelevant stuff } } 及 无济于事。在这两种情况下,我都会收到错误消息没

我已经研究了十几个qst,其中有短语
没有合适的默认构造函数可用
,但没有任何帮助解决我自己的问题

<>这是一个非常基础的C++ QST(因为我还在学习绳子),所以如果你的眼睛在简单化时就很抱歉。我试图继承一个类,它有一个没有参数的模板构造函数。例如:

class Base {
public:

template<class T>
Base() {
  T *t = this;
  //more irrelevant stuff
}

}

无济于事。在这两种情况下,我都会收到错误消息
没有合适的默认构造函数可用
。怎么做呢?如果这是不可能的,你能解释一下原因吗

当我像
template Base(T*T)
(将template参数作为参数)那样设置构造函数时,它就起作用了


p、 如果这很重要,在我的代码中,我还继承了另一个类派生的

中没有用于访问默认构造函数的语法

class blah_t
{
public:
    template< class other_t > blah_t() {}
};
正如神圣标准所解释的,构造函数没有名字


但是,回到原来的问题,为了能够指定模板参数,您需要一些涉及模板参数类型的普通函数参数

为什么需要
T
?你就不能这样做吗?我还没有尝试,但您可能需要
派生():基()
。我认为CRTP在这里可能会更好。从我观察到的情况来看,当基类被继承时,
this
指针会指向最顶层的继承类。向下投票者:诚然,这是一个基本的qst,但它在stackoverflow的范围内。如果你愿意解释为什么这值得投反对票,那么我可以避免将来犯这样的错误。谢谢。我明白了,用+1来反击无法解释的下伏特。所以让它工作的唯一方法就是包括
(T*T)
或其他什么?构造函数参数。我将其更改为“template Base(T*T)”,然后作为构造函数参数传入
this
。它实现了与我尝试执行的相同的效果,但我得到了编译器警告“this”:在基本成员初始值设定项列表中使用。为什么要警告将'this'作为构造函数参数传递?一些编译器对此发出警告,因为在最常见的情况下,可能会做一些不好的事情,比如引用尚未初始化的内容。如果可以的话,关掉那个警告。对于良好的工作,最好有完全干净的编译,没有诊断,这样您就可以确保注意到任何真正的诊断。也就是说,你用这个模板做的事情听起来有点奇怪。但是你必须发布更完整的代码或描述,以便读者能够提出替代方案。干杯-考虑之后,我认为你说使用模板是一种奇怪的方式是正确的。我的主要目标是坚持标准C++,因为我想开发一个可以被其他人重用的类。CRTP解决方案似乎是一条出路。
class Derived : public Base {
public:
  Derived() {

  }
}
class blah_t
{
public:
    template< class other_t > blah_t() {}
};
class blah_t
{
public:
    blah_t() {}
    blah_t( int = 666 ) {}
};