Явное создание экземпляра универсальной функции-члена универсальной структуры - PullRequest
2 голосов
/ 30 марта 2010

У меня есть структура с параметром шаблона, Stream. Внутри этой структуры есть функция с собственным параметром шаблона Type.

Если я пытаюсь принудительно сгенерировать и вызвать конкретный экземпляр функции, он работает нормально, , если Я нахожусь в контексте, где известен точный тип структуры. Если нет, я получаю ошибку компиляции. Это похоже на ситуацию, когда я пропускаю typename, но нет вложенных типов. Я подозреваю, что упускаю что-то фундаментальное, но я так долго смотрю на этот код, все, что я вижу, это рыжие, и откровенно писать код, использующий шаблоны, никогда не было моей сильной стороной.

Ниже приведен простейший пример, который я мог бы привести, который иллюстрирует проблему.

#include <iostream>

template<typename Stream>
struct Printer {
  Stream& str;
  Printer(Stream& str_) : str(str_) { }

  template<typename Type>
  Stream& Exec(const Type& t) {
    return str << t << std::endl;
  }
};

template<typename Stream, typename Type>
void Test1(Stream& str, const Type& t) {
  Printer<Stream> out = Printer<Stream>(str);
  /****** vvv This is the line the compiler doesn't like vvv ******/
  out.Exec<bool>(t); 
  /****** ^^^ That is the line the compiler doesn't like ^^^ ******/
}

template<typename Type>
void Test2(const Type& t) {
  Printer<std::ostream> out = Printer<std::ostream>(std::cout);
  out.Exec<bool>(t);
}

template<typename Stream, typename Type>
void Test3(Stream& str, const Type& t) {
    Printer<Stream> out = Printer<Stream>(str);
    out.Exec(t);
}

int main() {
  Test2(5);
  Test3(std::cout, 5);
  return 0;
}

Как написано, gcc-4.4 дает следующее:

test.cpp: В функции 'void Test1 (Stream &, const Type &)':
test.cpp: 22: ошибка: ожидаемое первичное выражение перед 'bool'
test.cpp: 22: ошибка: ожидается ';' до 'bool'

Test2 и Test3 оба компилируются чисто, и если я закомментирую Test1, программа выполняется, и я получаю «1 5», как и ожидалось. Так что, похоже, нет ничего плохого в идее того, что я хочу сделать, но я что-то испортил в реализации.

Если бы кто-нибудь мог пролить свет на то, что я пропускаю, это было бы очень признательно.

1 Ответ

3 голосов
/ 30 марта 2010

Вы должны сообщить компилятору, что зависимое имя Printer<Stream>::Exec является шаблоном:

out.template Exec<bool>(t);

Это тот же принцип, что и для typename, просто в этом случае проблемное имя - это не тип, а шаблон.

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