Почему этот параметр шаблона по умолчанию запрещен? - PullRequest
6 голосов
/ 09 января 2011

У меня есть следующий класс:

template <typename Type = void>
class AlignedMemory {
public:
    AlignedMemory(size_t alignment, size_t size)
        :   memptr_(0) {
        int iret(posix_memalign((void **)&memptr_, alignment, size));
        if (iret) throw system_error("posix_memalign");
    }
    virtual ~AlignedMemory() {
        free(memptr_);
    }
    operator Type *() const { return memptr_; }
    Type *operator->() const { return memptr_; }
    //operator Type &() { return *memptr_; }
    //Type &operator[](size_t index) const;
private:
    Type *memptr_;
};

И попытка создать автоматическую переменную, подобную этой:

AlignedMemory blah(512, 512);

Это дает следующую ошибку:

src / cpfs / entry.cpp: 438: ошибка: пропущены аргументы шаблона перед бла

Что я делаю не так?void не является разрешенным параметром по умолчанию?

Ответы [ 2 ]

11 голосов
/ 09 января 2011

Я думаю, что вам нужно написать:

AlignedMemory<> blah(512, 512);

См. 14.3 [temp.arg] / 4:

По умолчанию аргументы шаблона шаблон-аргумент список может быть пустым.В этом случае пустые скобки <> по-прежнему должны использоваться в качестве template-arguments-list .

5 голосов
/ 09 января 2011

Ваш синтаксис неправильный:

AlignedMemory blah(512, 512); //wrong syntax

Правильный синтаксис такой:

AlignedMemory<> blah(512, 512); //this uses "void" as default type!

Само сообщение об ошибке дает эту подсказку. Посмотрите на это снова:

src / cpfs / entry.cpp: 438: ошибка: отсутствует аргументы шаблона до «ЬиЙ»

PS: я уверен, что "buf" - опечатка. Вы хотели написать «бла» - название вашей переменной!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...