Как включить член шаблона в класс? - PullRequest
1 голос
/ 13 июля 2010

Я пытаюсь создать класс, в котором есть объект-шаблон.Например,

mt_queue_c<int>    m_serial_q("string");

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

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

#include <deque>
#include <queue>
#include <pthread.h>
#include <string>
#include <iostream>

template <class T, class Container = std::deque<T> >
class mt_queue_c {
public:
    explicit mt_queue_c(const std::string    &name,
                        const Container      &cont = Container()) :
        m_name(name),
        m_c(cont)
        {};
    virtual ~mt_queue_c(void) {};
protected:
    // Name of queue, used in error messages.
    std::string        m_name;

    // The container that manages the queue.
    Container          m_c;
};

// string object for a test
std::string  test2("foobar");

// Two tests showing it works as a global
mt_queue_c<char>   outside1("string");
mt_queue_c<char>   outside2(test2);

// Two failed attempts to include the object as a member object.
class blah {
    mt_queue_c<int>    m_serial_q("string");    // this is 48
    mt_queue_c<char>   m_serial_q2(test2);      // this is 50
};

// Adding main just because.
int main ()
{
    std::cout << "Hello World" << std::endl;
}

Когда я делаю это, я получаю следующие ошибки:

make

g ++ -m32 -fPIC -Werror -Wall -Wunused-function -Wunused-параметр -Wunused-переменная -I.-I / views / EVENT_ENGINE / LU_7.0-2 / server / CommonLib / include -I / views / EVENT_ENGINE / LU_7.0-2 / server / Common / Build / Include -g -c -o $ {OBJ_DIR} / testTemp.o testTemp.cxx

testTemp.cxx: 48: ошибка: ожидаемый идентификатор перед строковой константой

testTemp.cxx: 48: ошибка: ожидается ','или' ... 'перед строковой константой

testTemp.cxx: 50: ошибка:' test2 'не является типом

make: *** [/views/EVENT_ENGINE/LU_7.0-2/server/applications/event_engine/Obj/testTemp.o] Ошибка 1

Что я делаю не так?Как можно «встроить» шаблон в класс, если мы хотим, чтобы тип шаблона всегда был одинаковым для определенного класса?

Заранее благодарен за помощь.

Ответы [ 3 ]

2 голосов
/ 13 июля 2010

В частности, это не имеет ничего общего с шаблонами - вы не можете инициализировать нестатические члены непосредственно в определении класса (C ++ 03, §9.2 / 4 ):

Член-декларатор может содержать инициализатор константы, только если он объявляет static член (9.4) из const целочисленного или const типа перечисления, см. 9.4.2.

Если вы хотите явно инициализировать элементы данных, используйте список инициализаторов конструкторов:

blah::blah() : m_serial_q("string") {}
2 голосов
/ 13 июля 2010

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

class blah { 
    mt_queue_c<int>    m_serial_q;    // this is 48 

    mt_queue_c<char>   m_serial_q2;      // this is 50 

    blah() : m_serial_q("string"), m_serial_q2(test2)
    {

    }
}; 
0 голосов
/ 13 июля 2010

сделать конструктор по умолчанию для вашего класса blah. и инициализировать значение для объекта шаблона в списке инициализации конструктора

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