c++ 为什么不调用默认构造函数?

pxiryf3j  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(177)

我想传递类名oltosmol作为参数,这样它将创建一个带有默认构造函数的对象。它通常可以工作,但在这里不行。而且问题只存在于oltosmol

error: request for member 'creator' in 'smolifier', which is of non-class type 'StatP::CharProcessor\<StatP::oltosmol\>(StatP::oltosmol)'
namespace StatP
{
    class oltosmol
    {
    public:
        oltosmol() {}
        char transform(char c)
        {
            if (c >= 'A' && c <= 'Z')
                return c + 'a' - 'A';
            return c;
        }
    };
    class Cutifier
    {
        unsigned period;
        unsigned counter;
    public:
        Cutifier(unsigned p): period(p), counter(0) {}
        char transform(char c)
        {
            if (counter == period)
            {
                counter = 0;

                if (c == ' ')
                    return '\3';
                else if (c >= 'a' && c <= 'z')
                    return c - 'a' + 'A';
                else if (c >= 'A' && c <= 'Z')
                    return c - 'A' + 'a';
                return c;
            }
            else
            {
                counter++;
                return c;
            }
        }
    };

    template<class Transformer>
    class CharProcessor
    {
        Transformer transformer;
    public:
        CharProcessor(const Transformer &t): transformer(t) {}

        String<char> creator(String<char> &s)
        {
            char *n_data = new char[s.get_length() + 1];
            for (unsigned i = 0; i < s.get_length(); i++)
                n_data[i] = transformer.transform(s[i]);
            n_data[s.get_length()] = '\0';

            return String<char>(n_data);
        }
        void changer(String<char> &s)
        {
            for (unsigned i = 0; i < s.get_length(); i++)
                s[i] = transformer.transform(s[i]);
        }
    };
}

int main()
{
    const char coca_cola[] = "Coca-cola";

    String<char> water_name = coca_cola;
    copy = water_name;

//    ...

    StatP::CharProcessor<StatP::oltosmol> smolifier(StatP::oltosmol);
    std::cout << smolifier.creator(water_name) << "\n\n";

    return 0;
}

我试过添加()并删除命名空间,但仍然不起作用。如果我先将对象赋给变量,程序会运行,但我不想也不应该这样做。

goucqfw6

goucqfw61#

此构造函数传递的指针指向您不打算传递的函数:

... smolifier(StatP::oltosmol)

要执行您想要的操作,您需要示例化类,然后将其传递给CharProcessor

StatP::oltosmol smol{};
... smolifier(smol);

但是在您的情况下,更好的解决方案是从构造函数中移除引用,并通过值传递它,然后将它完全移到CharProcessor中;

CharProcessor(Transformer t): transformer(std::move(t)) {}
...
// And now you can just put braces
CharProcessor<oltsmol> smolifer({});
bq3bfh9z

bq3bfh9z2#

在示例化smolifier时,必须传递一个示例化对象。在参数列表中写入类型是无效语法。
这就是你需要的

StatP::CharProcessor smolifier(StatP::oltosmol{});

注意,由于CTAD,您实际上不必拼写出类模板的类型参数,因为它可以从构造函数参数中推断出来。
live demo,替换了某些类型,因为您没有提供它们)

相关问题