jeudi 13 janvier 2022

How to use anonymous enum type in class method (class code is in separate files)? [duplicate]

I'm trying to pass value of anonymous enum to class method. It is defined in code that I depend on and cannot change. Enum is defined inside a structure, in form as in code below. I tried to use template method, and it works, but only if both main, class definition, and method definition are in one file. Why? I use C++11. Here is my approach:

mcve.cpp:

#include "B.h"

typedef struct {
    enum {
        OPTION1,
        OPTION2
    } some_enum;
} some_struct;

class A
{
public:
    template<class functType> int my_method(functType type);
};

template<class functType> int A::my_method(functType type)
{
    switch (type)
    {
    case some_struct::OPTION1:
        return 0;
    case some_struct::OPTION2:
        return 1;
    default:
        return 2;
    }
    return 0;
}

template<class functType> int B::my_method(functType type)
{
    return 0;
}

int main(void)
{

    int ret;
    A a;
    ret = a.my_method(some_struct::OPTION1);

    B b;
    ret = b.my_method(some_struct::OPTION1);

    return ret;

}

B.h:

class B
{
public:

    template<class functType> int my_method(functType type);

};

This works, but when I move following part to separate file:

template<class functType> int B::my_method(functType type)
{
    return 0;
}

I get linker error:

<linker_path>/ld: <project_path>/src/mcve.cpp:43: undefined reference to `int B::my_method<some_struct::{unnamed type#1}>(some_struct::{unnamed type#1})'

I use Eclipse and it's built in build system.

Aucun commentaire:

Enregistrer un commentaire