Ошибка GCC: неполный тип 'claculator' используется в спецификаторе вложенного имени - PullRequest
1 голос
/ 16 июля 2011

Я разрабатываю библиотеку, когда я компилирую свой код с помощью GCC (в Windows с CodeBlocks), исходный код не компилируется, и появляется эта ошибка:

ошибка: неполный тип 'claculator'используется в описателе вложенного имени.

Я пишу пример кода, который генерирует эту ошибку точно:

class claculator;

template<class T>
class my_class
{
    public:

    void test()
    {
        // GCC error: incomplete type 'claculator' used in nested name specifier
        int x = claculator::add(1, 2);
    }

    T m_t;
};

// This class SHOULD after my_class.
// I can not move this class to top of my_class.
class claculator
{
    public:

    static int add(int a, int b)
    {
        return a+b;
    }
};

int main()
{
    my_class<int> c;
    c.test();

    return 0;
}

Как я могу решить эту ошибку?

Обратите внимание, чтоМой исходный код успешно скомпилирован в Visual Studio.

Спасибо.

1 Ответ

7 голосов
/ 16 июля 2011

Это очень просто.Определите test() после определение класса calculator как:

class calculator;

template<class T>
class my_class
{
    public:

    void test(); //Define it after the definition of `calculator`

    T m_t;
};

// This class SHOULD after my_class.
// I can not move this class to top of my_class.
class calculator
{
    public:

    static int add(int a, int b)
    {
        return a+b;
    }
};

//Define it here!
template<class T>
void my_class<T>::test()
{
     int x = calculator::add(1, 2);
}

Таким образом, complete определение calculator известнокомпилятор, когда он анализирует определение из test().

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