Здравствуйте!
Код:
t.h
#pragma once
template<class T>
void fn(T v)
{
std::cout << "common\n";
}
template<>
void fn<double>(double v)
{
std::cout << "spec\n";
}
main.cpp
#include "stdafx.h"
#include "t.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
b.cpp
#include "stdafx.h"
#include "t.h"
Выдаёт ошибку:
Compiling...
main.cpp
Linking...
b.obj : error LNK2005: "void __cdecl fn<double>(double)" (??$fn@N@@YAXN@Z) already defined in main.obj
Debug/main.exe : fatal error LNK1169: one or more multiply defined symbols found
Не подскажете, где я напортачил?
Дело в том, что тело функции оказывается в двух модулях одновременно.
Можно сделать так:
> t.h
> > #pragma once
>
> template<class T>
> void fn(T v)
> {
> std::cout << "common\n";
> }
template<> void fn<double>(double v);
>
// [b]t.c
>
template<>
>
void fn<
double>(
double v)
> {
> std::cout <<
"spec\n";
> }
>
Либо определить функцию в заголовочном файле как inline или static.
template<> inline void fn<double>(double v) {}
template<> static void fn<double>(double v) {}
Posted via RSDN NNTP Server 1.9
Здравствуйте, valker, Вы писали:
C++ Templates: The Complete Guide
12.3.2 Full Function Template Specialization
...
A full specialization is in many ways similar to a normal declaration (or rather, a normal redeclaration). In particular, it does not declare a template, and therefore only one definition of a noninline full function template specialization should appear in a program.
...
Так что делай свою специализацию inline, или помещай ее в безымянное пространство имен, либо разделяй объявление/определение как для обычной функции:
template<>
void fn(double v);
...
template<>
void fn(double v)
{
}
Здравствуйте, Bell, Вы писали:
B>...или помещай ее в безымянное пространство имен,...
Это я не подумавши сказал — нельзя так