首页 > 解决方案 > 可变模板成员函数头/源文件

问题描述

在 abc.h 文件中,我有一个类:

class ABC
{
    public:

        template <typename... Args>
        ABC(Args... args);

    protected:

        template <typename Type, typename... Args>
        void processArguments(Type &argument, Args... args);

        template <typename Type>
        void processArguments(Type &argument);

        template <typename Type>
        void doSomethingWithTheArgument(Type &argument);
};

然后,我使用以下内容创建了 abc.cpp:

template <typename... Args>
ABC::ABC(Args... args)
{
    processArguments(args...);
}

template <typename Type, typename... Args>
void ABC::processArguments(Type &argument, Args... args)
{
    doSomethingWithTheArgument(argument);
    processArguments(args...);
}

template <typename Type>
void ABC::processArguments(Type &argument)
{
    doSomething(argument);
}

template <typename Type>
void ABC::doSomethingWithTheArgument(Type &argument)
{
    std::cout << argument << std::endl;
}

只是一些test.cpp:

int main()
{
    ABC abc(1, 2, 3, "somehing", 2 + 5);
    return 0;
}

然后我想用下面的命令行来构建它:

g++ --std=c++11 abc.cpp test.cpp

然后砰!

/tmp/ccflWDpf.o: In function `main':
test.cpp:(.text+0x3b): undefined reference to `ABC::ABC<int, int, int, char const*, int>(int, int, int, char const*, int)'
collect2: error: ld returned 1 exit status

当我将整个代码放在一个 xyz.cpp 文件中时,代码编译得很好。它是否说明不能在不同的翻译单元中提供可变参数模板的实现?

标签: c++variadic-templates

解决方案


推荐阅读