【发布时间】:2026-01-04 00:15:02
【问题描述】:
我有以下代码:
item.h
using item_t = char;
constexpr item_t no_item = '*';
constexpr item_t item1 = 'a';
constexpr item_t item2 = 'b';
bool isItem(const item_t &item) {
return item == no_item || item == item1 || item == item2;
}
class base {
public:
base() : value(no_item) {}
base(const item_t &item) : value(item) {}
friend std::ostream &operator<<(std::ostream &out, const base &b) {
out << b.value;
}
/*other stuff*/
private:
item_t value;
};
template<bool(*check)(const item_t&)>
class derivedTmp : base {
public:
derivedTmp() : base() {}
derivedTmp(item_t item) {
if (!check(item)) {
base::base();
}
else {
base::base(item);
}
}
};
using derived = derivedTmp<isItem>;
const derived d1(item1);
const derived d2(item2);
main.cpp
#include<iostream>
#include "item.h"
int main() {
cout << item1 << "\t" << item2 << "\n";
}
我真的不明白为什么它不起作用。如果有一些语法错误,它并不在意,因为这意味着我犯了一个错误,但程序编译得很好;输出是* *,而不是我期望的a b。谁能向我解释为什么?我在 Visual Studio 19 中使用 C++17。
【问题讨论】:
-
if(!check(item)) { base::base(); }- 嗯....那应该是什么?base部分推导已经构建。你不能“重建”它。 -
调用base的默认构造函数,否则调用其他构造函数,base部分怎么可能已经构造好了,我没有调用构造函数
-
正如我所说,在您输入派生 ctor 的
{时,基类构造函数已经被触发(一种或另一种方式)。你不能只是重做。我很难看到带有单个引用参数的单个构造函数以及默认引用no_item的单个构造函数如何无法解决您真正在这里尝试完成的任何事情。 -
@Linus “基部分怎么可能已经构造了,我没有调用构造函数” - 如果你没有从成员中显式调用基类构造函数派生类构造函数的初始化列表,编译器会为你隐式调用基类的默认构造函数。在派生构造函数的主体开始运行之前,基类总是完全构造。
标签: c++ oop inheritance c++17