Еще одна проблема с шаблонами - PullRequest
1 голос
/ 16 сентября 2010
#include "stdafx.h"
#include <iostream>
using std::cout;

template<class T>
class IsPolymorphic
{
 template<class T>
 struct Check
 {
  enum {value = false};
 };

 template<class T>
 struct Check<T*>
 {
  enum {value = true};
 };
public: 
 enum {value = Check<T>::value};

};

template<bool flag, class T, class U>
struct Select
{
 typedef T value_type;
};

template<class T, class U>
struct Select<true,T,U>
{
 typedef U value_type;
};

template<class T, bool isPoly = IsPolymorphic<T>>
class Container
{
public:
 typedef typename Select<isPoly,T,T*>::value_type value_type;
 Container(){}
};

int _tmain(int argc, _TCHAR* argv[])
{
 //cout << IsPolymorphic<int*>::value;
 Container<int> c;
 return 0;
}

Я получаю следующие ошибки:
Ошибка 3, ошибка C2512: «Контейнер»: не доступен соответствующий конструктор по умолчанию
Ошибка 2, ошибка C2133: «c»: неизвестный размер
Ошибка 1, ошибка C2975: «Контейнер»: недопустимый аргумент шаблона для «isPoly», ожидаемое постоянное выражение во время компиляции

Что касается этих ошибок:
нет 3 - ясно, что есть dflt ctor - так что происходит?
нет 2 - почему это неизвестный размер? Я указал int как тип, так почему он будет неизвестен?
№ 1 - точно так же, как нет 2
Спасибо за любую помощь с этим.
Спасибо всем вам за помощь в решении этой проблемы

Ответы [ 3 ]

3 голосов
/ 16 сентября 2010

Ваш код содержит несколько ошибок:

  • Вы пытаетесь скрыть параметр шаблона T внутренним объявлением этого имени
  • Вы используете IsPolymorphic<T> intead of IsPolymorphic<T>::value
  • Что говорит @ potatoswatter .
2 голосов
/ 16 сентября 2010

Попробуйте это:

template<class T, bool isPoly = IsPolymorphic<T>::value>
1 голос
/ 16 сентября 2010

Может быть, вы имеете в виду:

bool isPoly = IsPolymorphic<T>::value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...