簡體   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