Re: Проблема с полной специализацией глобальной функции
От: Bell Россия  
Дата: 06.10.05 13:16
Оценка: 8 (1)
Здравствуйте, 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)
{
 
}
Любите книгу — источник знаний (с) М.Горький
Re: Проблема с полной специализацией глобальной функции
От: sch  
Дата: 06.10.05 13:06
Оценка: 2 (1)
Дело в том, что тело функции оказывается в двух модулях одновременно.

Можно сделать так:
> 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  
Дата: 06.10.05 13:03
Оценка:
Здравствуйте!

Код:


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



Не подскажете, где я напортачил?
Re[2]: Проблема с полной специализацией глобальной функции
От: Bell Россия  
Дата: 06.10.05 13:17
Оценка:
Здравствуйте, Bell, Вы писали:

B>...или помещай ее в безымянное пространство имен,...


Это я не подумавши сказал — нельзя так
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.