类vs Lib,可变参数模板函数中的不同行为

时间:2013-12-07 16:55:17

标签: c++ templates

以下代码效果很好(示例来自cppreference.com):

class SomeClass
{
public:
    void tprintf(const char* format) // base function
    {
        std::cout << format;
    }

    template<typename T, typename... Targs>
    void tprintf(const char* format, T value, Targs... Fargs) // recursive variadic function
    {
        for (; *format != '\0'; format++) {
            if (*format == '%') {
                std::cout << value;
                tprintf(format + 1, Fargs...); // recursive call
                return;
            }
            std::cout << *format;
        }
    }
};

void main()
{
    SomeClass someClass;
    someClass.tprintf("% world% %\n", "Hello", '!', 123);
}

当我尝试通过创建SomeClass类的lib来复制它时,我得到一个未解析的外部符号错误:

SomeClass.h

class SomeClass
{
public:

    void tprintf(const char* format);

    template<typename T, typename... Targs>
    void tprintf(const char* format, T value, Targs... Fargs);
}

SomeClass.cpp

void SomeClass::tprintf(const char* format) // base function
{
    std::cout << format;
}

template<typename T, typename... Targs>
void SomeClass::tprintf(const char* format, T value, Targs... Fargs) // recursive variadic function
{
    for (; *format != '\0'; format++) {
        if (*format == '%') {
            std::cout << value;
            tprintf(format + 1, Fargs...); // recursive call
            return;
        }
        std::cout << *format;
    }
}

的main.cpp

#include <ibppWrapper.h>

void main()
{
    SomeClass someClass;
    someClass.tprintf("% world% %\n", "Hello", '!', 123);
}

未解决的外部符号错误:

error LNK2019: unresolved external symbol "public: void __thiscall SomeClass::tprintf<char const *,char,int>(char const *,char const *,char,int)" (??$tprintf@PBDDH@SomeClass@@QAEXPBD0DH@Z) referenced in function _main

结论

似乎链接器正在我的SomeClass lib中搜索具有确切参数的函数:

SomeClass::tprintf<char const *,char,int>(char const *,char const *,char,int) 

虽然它应该找到或搜索:

SomeClass::tprintf<T,... Targs>(char const *,T, ... Targs)

问题

我的结论是否正确? 这是预期的行为吗? 有解决方案吗?

0 个答案:

没有答案