Принудительная реализация функции шаблона в классе - PullRequest
3 голосов
/ 01 сентября 2011

У меня есть функция, которая объявлена ​​как:

template<typename T>
void MyFunction();

А класс:

template<typename T>
class MyClass
{
public:

    typedef void (*Function_T)();
    Function_T m_Func;
    void DoSomething()
    {
        m_Func = &MyFunction<T>;
    }
}

Когда я использую класс, я не определил ошибку символов на MyFunction<T>.
Если я изменю DoSomething на

void DoSomething()
{
    m_Func = &MyFunction<T>;
    return;
    MyFunction<T>();
}

Все работает, но это выглядит как обходной путь и, вероятно, не будет работать с оптимизацией.
Я не могу добавить

template void MyFunction<T>;

классу, потому что он говорит, что не может быть в классе. Есть ли другой способ, которым я могу вызвать создание экземпляра функции?

Edit:
Я смог написать тест, который не прошел, но в g ++ он имеет другое сообщение и фактически ошибку компилятора: http://ideone.com/RbMnh

Ответы [ 3 ]

3 голосов
/ 01 сентября 2011

Ваш код прекрасно компилируется для меня с использованием GCC, поэтому я не уверен, что это решение решит вашу конкретную проблему, но вы можете явно создать экземпляры шаблонных функций следующим образом:

// Template function defined:
template <typename T>
void MyFunction() {
    // body
}

// Template function instantiated:
template void MyFunction<int>();
3 голосов
/ 01 сентября 2011

Ваш код также будет работать с оптимизацией.Хотя я не знаю, почему просто m_Func = &MyFunction<T> не работает. GCC 4.3.4 компилирует это нормально .Какой компилятор вы используете?

И вы также можете сделать это:

void DoSomething()
{
    if ( false) MyFunction<T>();
    m_Func = &MyFunction<T>;
    return;
}

Кстати, тип указателя на функцию неправильно определен.Должно быть так:

typedef void (*Function_T)();
                     //   ^^ put this!
0 голосов
/ 01 сентября 2011

Проблема может быть либо в ошибке компилятора, либо в части кода, которую вы не показываете. Попробуйте создать минимальный пример, который воспроизводит проблему, это минимальный пример, который я смог создать, и он прекрасно компилируется как с clang ++ 2.8, так и с g ++ 4.4 / 4.5:

drodriguez@drodriguez-desktop:/tmp$ cat test.cpp 
#include <iostream>

template <typename T>
void function() {
}

template <typename T>
struct type {
    typedef void (*Func)();
    Func _f;
    void f() {
        _f = &function<T>;
    }
};

int main() {
    type<int> t;
    t.f();
    std::cout << t._f << std::endl;
}
drodriguez@drodriguez-desktop:/tmp$ /usr/bin/clang++ --version
clang version 2.8 (branches/release_28)
Target: x86_64-pc-linux-gnu
Thread model: posix
drodriguez@drodriguez-desktop:/tmp$ /usr/bin/clang++ -o test test.cpp && ./test
1
drodriguez@drodriguez-desktop:/tmp$ g++ --version
g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

drodriguez@drodriguez-desktop:/tmp$ g++-4.4 -o test test.cpp && ./test
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...