gpt4 book ai didi

c++ - 模板案例的编译器警告,模板特化应涵盖

转载 作者:行者123 更新时间:2023-11-30 02:42:59 24 4
gpt4 key购买 nike

在我用 C++98 编码的过程中,我收到一个我不理解的奇怪的编译器警告:(参见:

我有一个文件 TemplateSpecialization.hpp:

namespace TemplateNamespace
{
template <typename T> T getParam(int param)
{
return static_cast<T>(param);
}
}

struct A
{
A () : aaa(10) {}
int aaa;
template <typename T> T getAaa()
{
return TemplateNamespace::getParam<T>(aaa);
}
};

和一个文件 TemplateSpecialization.cpp:

#include "TemplateSpecialization.hpp"
#include <string>
#include <sstream>

namespace TemplateNamespace {
template<> std::string getParam<std::string>(int param)
{
std::stringstream ss;
ss << param;
return ss.str();
}
}

当我在其他 .CPP 文件中的任何地方调用此函数时,例如测试.cpp 由

A a; std::string s = a.getAaa<std::string>();

并使用 gcc 4.8.2 版编译所有内容,我收到此警告:

In file included from /var/fpwork/sokeks/Test.cpp:22:0:
/var/fpwork/sokeks/TemplateSpecialization.hpp: In instantiation of 'T TemplateNamespace::getParam(int) [with T = std::basic_string<char>]':
/var/fpwork/sokeks/TemplateSpecialization.hpp:15:50: required from 'T A::getAaa() [with T = std::basic_string<char>]'
/var/fpwork/sokeks/Test.cpp:161:43: required from here
/var/fpwork/sokeks/TemplateSpecialization.hpp:5:36: warning: invalid conversion from 'int' to 'const char*' [-fpermissive]
return static_cast<T>(param);
^

我完全不明白,是什么导致了这个警告!为什么编译器根本指向专用的模板函数!?这到底是什么意思?我确实使用 std::string,而不是 const char*。

提前感谢您的帮助!

最佳答案

这是一个可见性问题:特化在另一个编译单元中,当需要实例化模板时它是不可见的。将模板和声明放入您的头文件中,将完全专用函数的定义放入 cpp 文件中并使用一些包含保护:

TemplateSpecialization.hpp

#pragma once

#include <string>
#include <sstream>

namespace TemplateNamespace
{
template <typename T> T getParam(int param)
{
return static_cast<T>(param);
}

template<> std::string getParam<std::string>(int param);
}

struct A
{
A() : aaa(10) {}
int aaa;
template <typename T> T getAaa()
{
return TemplateNamespace::getParam<T>(aaa);
}
};

TemplateSpecialization.cpp

#include "TemplateSpecialization.hpp"

template<> std::string TemplateNamespace::getParam<std::string>(int param)
{
std::stringstream ss;
ss << param;
return ss.str();
}

关于c++ - 模板案例的编译器警告,模板特化应涵盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26562398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com