2016-02-04 1 views
0

на моем последнем экзамене мне нужно написать некоторый код, чтобы сделать этот основной файл компилируемым. Но после экзамена я трачу много времени, и у меня нет идеи, что я должен добавить в функцию test_value. Я знаю, что test_value должен быть статичным, но я понятия не имею, что я должен возвращать. Может ли кто-нибудь дать мне подсказку, что делать с этой проблемой?C++ шаблон с парой и статической функцией

#include <utility> 
#include <iostream> 

typedef int Int; 

template <typename T> 
class ptr 
{ 
public: 
    T val; 
    ptr(void* a){} 
    static T test_value(){ 
//what exactly should be there? 
    } 
}; 

int main(int argc, char const *argv[]) 
{ 
    std::pair<int,int>* a = new std::pair<int,int>; 
    std::cout<<a->first; 
    typedef ptr<std::pair<Int,Int> > TestType; 
    TestType t1 = TestType(new TestType::test_value()); 
    return 0; 
} 

ответ

0

Это трюк. Для того, чтобы скомпилировать new TestType::test_value(), необходимо, чтобы TestType::test_value был тип, а не функция. Затем новое выражение создаст объект такого типа, а () будет инициализатором для объекта.

Не имеет значения, какой тип TestType::test_value is; вы можете использовать, например, int. Он просто должен быть чем-то, что можно инициализировать с помощью ().

typedef int test_value; 

Однако, вы не могли бы использовать void, ссылочный тип или тип класса с конструктором не по умолчанию. Вы также не могли использовать тип cv-qual, потому что тогда указатель на него не мог быть преобразован в void*, что необходимо для вызова конструктора ptr.

http://coliru.stacked-crooked.com/a/781cf8f871f6f1a7

+0

если TestType :: test_value является ИНТ ЬурейеЕ, как вы ожидаете TestType (новый Int()) для компиляции? –

+0

@SamVarshavchik Конструктор принимает 'void *', поэтому вы можете преобразовать в него другой тип указателя. – Brian

+0

У меня просто есть ментальный блок, видя выражение «new int()». Просто сделайте ментальный блок при вызове конструктора для «int». –

Смежные вопросы