繁体   English   中英

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

[英]Why the default constructor isn't called?

我想将 class 名称oltosmol作为参数传递,这样它将创建一个带有默认构造函数的 object。 它通常可以工作,但在这里不行。 问题仅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;
}

我已经尝试添加()和删除命名空间,但它仍然不起作用。 如果我首先将 object 分配给一个变量,程序就会运行,但我不想也不应该这样做。

此构造函数将指针传递给 function,这不是您打算传递的内容:

... smolifier(StatP::oltosmol)

要完成您想要的事情,您需要实例化您的 class 并将其传递给CharProcessor

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

但是在您的情况下,更好的解决方案是从构造函数中删除引用并按值传递它并将其完全移动到CharProcessor

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

smolifier的实例化中,您必须传递一个实例化的 object。在参数列表中写入类型是无效语法。

这就是你在那里需要的:

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

请注意,由于 CTAD,您实际上不必拼出 class 模板的类型参数,因为它可以从构造函数参数中推断出来。

现场演示,替换了一些类型,因为你没有提供它们)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM